0
点赞
收藏
分享

微信扫一扫

Java8新特性:强大的Stream API——再看不懂我找不到女朋友


不要自卑,去提升实力
互联网行业谁技术牛谁是爹
如果文章可以带给你能量,那是最好的事!请相信自己
加油o~

Java8新特性:强大的Stream API——再看不懂我找不到女朋友_lambda

Java8新特性:Stream

Stream是Java8中产生的一个新特性,可以把它理解成一种流,但也可以把它当做是一种特殊的容器

他可以结合Lambda表达式帮我们处理数据变得非常容易

一般来说使用它有三个步骤:

1、创建Stream

2、中间操作

3、终止操作(终端操作)

还是举个例子吧:

我们还是来遍历这个集合

List<Employee> list= Arrays.asList(
new Employee("张三",18,5000),
new Employee("李四",28,6000),
new Employee("王五",48,4000),
new Employee("马六",35,3000),
new Employee("田七",25,3000),
new Employee("田七",25,3000)
);

我们之前用Lambda表达式可以用

list.foreach((e)->System.out.println(e))

现在可以使用另外一种方式:

list.stream()
.foreach((e)->System.out.println(e))

或者是:

list.stream()
.foreach(System.out::println)

后两种写法其实是一样的,第二种就是实现了抽象方法,第三种是进行了类方法引用

最后一句打印就是终止操作,如果一个流不进行终止的话,那么中间的数据操作是不会执行的

Stream.iterate(1,(x)->x+2).limit(10).forEach(System.out::println);

这个是产生无限流,要用limit进行限制,类似于python中的列表生成器

Stream的一些方法

  • filter:参数是Lambda,可以利用他筛选出流内的一些数据
  • limit:截断流,使其元素不超过给定数量
  • skip:跳过元素,返回一个跳过前n个元素的流
  • distinct:通过元素的hashcode方法和equals方法去除重复元素,一般要进行重写

示例:挑选出员工年龄大于30岁的人

list.stream()
.filter((e)->e.getAge()>30)
.foreach(System.out::println)

示例:取出年龄大于30岁的前3个

list.stream()
.filter((e)->e.getAge()>30)
.limit(3)
.foreach(System.out::println)

示例:年龄大于30岁的前3个人不要

list.stream()
.filter((e)->e.getAge()>30)
.skip(3)
.foreach(System.out::println)

示例:去重属性相同的人,去重规则需要重写hashcode方法和equals方法

list.stream()
.filter((e)->e.getAge()>30)
.distinct()
.foreach(System.out::println)

Stream的映射

  • map:函数参数为Lambda表达式,将流中每个数据进行指点方法进行处理,返回相对于的元素存入新流中
  • flagmap:和map同理,但是有一点不同,当流中的每个元素是流时,用map就会进行两次遍历,类似于集合中的集合,就会遍历两遍,但是使用flagmap是就会将多个流合并成一个流,类似于集合中的addAll,他会将另外一个集合拆开,然后将每个元素再存入

List<String> list2=Arrays.asList("AF","sdf","Gd");
@Test
public void test11(){
list2.stream()
.map(Main::filterCharacter)
.forEach((e)-> System.out.println(e));
}
public static Stream<Character> filterCharacter(String str){
List<Character> list=new ArrayList<>();
for(Character ch:str.toCharArray()){
list.add(ch);
}
return list.stream();
}
@Test
public void test12(){
list2.stream()
.flatMap(Main::filterCharacter)
.forEach((e)-> System.out.println(e));
}

Stream排序

分为两种,自然排序和定制排序

第一种就是调用sorted方法,自动升序排序

但是要设计满足我们的需求,就要传入参数Lambda表达式,进行我们想要的操作,和实现Comparator的compare方法差不多

示例:优先按年龄排序从小到大,如果年龄相同则按照姓名字典序降序

list.stream()
.sorted((e1,e2)->{
if(e1.getAge==e2.getAge){
return -e1.getName.compareTo(e2.getName);
}else{
return Integer.compare(e1.getAge,e2.getAge);
}
})
.foreach(System.out::println);

Straem查找与匹配

  • allMatch:检查是否匹配所有元素
  • anyMatch:检查是否至少匹配一个元素
  • noneMatch:检查是否没有匹配所有元素
  • findFirst:返回第一个元素
  • findAny:返回当前流中的任意元素
  • count:返回流中元素的总个数
  • max:返回流中最大值
  • min:返回流中最小值

示例:

当我们要返回最大值时:

list.stream()
.max((e1,e2)->Integer.compare(e1.getAge,e2.getAge))
.foreach(System.out::println)

示例:

当我们要年龄中大于30岁中任意一个人时:

list.stream()
.filter((e)->e.getAge()>30)
.findAny()
.foreach(System.out.println)


举报

相关推荐

0 条评论