java8新特性之Stream流操作

举报
盼盼 发表于 2021/10/12 21:27:36 2021/10/12
【摘要】 Stream流操作是java8的最重要的新特性之一,功能强大,非常常用。可以说每个java coder必须掌握,这次把理论放在最后面,因为你可能不需要知道的多么详细,只是需要看看某个功能,可能听名字就大概知道它是做什么的。举个简单例子,现在给了你同学信息和成绩,你需要统计班级平均分// 以前可能的做法public static avgScore(List<Student> stus){   ...

Stream流操作是java8的最重要的新特性之一,功能强大,非常常用。可以说每个java coder必须掌握,这次把理论放在最后面,因为你可能不需要知道的多么详细,只是需要看看某个功能,可能听名字就大概知道它是做什么的。

举个简单例子,现在给了你同学信息和成绩,你需要统计班级平均分

// 以前可能的做法
public static avgScore(List<Student> stus){
    int sum=0;
    for (Student student : stus) {
        int core = student.core;
        sum += core;
    }
    return  ((double)sum / stus.size());
}
// 有了Stream后,
public static Double avgScore(List<Student> stus){
        OptionalDouble average = stus.stream().mapToDouble(stu -> stu.core).average();
        return average.getAsDouble();
    }

  

流的一些操作:
filter

filter过滤操作,只返回满足条件的数据

filter返回的流中只包含满足断言(predicate)的数据

//输出学生数组中,成绩大于80的学生
public static void  sFilter(List<Student> stus){
        stus.stream()
                .filter(student -> student.getCore()>80)
                .forEach(System.out::println);
    }

   

distinct

distinct输出的流中彼此不同的元素,通过Object.equals(Object)来检查是否包含相同的元素。

//从数组中找出不同的对象
public static void  sDistinct(List<Student> stus){
        stus.stream()
                .distinct()
                .forEach(System.out::println);
    }

 

map、peek与forEach对比

map可以对流中每一个的元素执行操作返回一种元素(可以相同),可以用来做元素转换

peek通常用于debug,会通过Consumer对流操作,但操作结果不返回Stream中。

forEach与map和peek类似,但由于不会返回元素,forEach的返回值是void,可以看做是流的终点操作

//map,从Student数组中获取由name组成的数组
public static void  sMap(List<Student> stus){
        List<String> collect = stus.stream()
                .map(student -> student.getName())
                .collect(Collectors.toList());
        stus.forEach(System.out::println);
        collect.forEach(System.out::println);
    }
//forEach,将Student数组中的成绩属性全部加1
public static void  sForEach(List<Student> stus){
        stus.stream()
                .forEach(student -> {
                    student.setCore(student.getCore()+1);
                });
        stus.forEach(System.out::println);
    }

   

peek和map的区别,在后面的理论中会对其原理做解释

// peek
IntStream.range(1,5).boxed().peek(i-> {
            i=i+1;
        }).forEach(System.out::print);
// 输出结果 1234
//map
IntStream.range(1,10).boxed().map(i-> i+1)
    .forEach(System.out::print);
// 输出结果 2345


   

可见peek中虽然对i进行+1操作,但没有改变源数据
flatMap

扁平化处理流,flatMap和map类似,但flatMap转换返回的是Stream对象,而map返回的是数据源的对象,flatMap会把返回的Stream对象中的元素压缩到一起,最后回到原来的流中

Map<String, List<Integer>> map = new LinkedHashMap<>();
map.put("a", Arrays.asList(1, 2, 3));
map.put("b", Arrays.asList(4, 5, 6));

List<Integer> allValues = map.values() // Collection<List<Integer>>
        .stream()                      // Stream<List<Integer>>
        .flatMap(List::stream)         // Stream<Integer>
        .collect(Collectors.toList());

System.out.println(allValues);

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。