2018-08-16使用流Stream

2018-08-16  本文已影响0人  huxiaofeng

一、引入流

List<String> collect = apples.parallelStream()
                .filter(d -> d.getWeight() > 150)
                .sorted(Comparator.comparing(Apple::getWeight).reversed())
                .map(Apple::getColor)
                .collect(Collectors.toList());
中间操作.png

小结

二、使用流

筛选和切片

1.用谓词筛选
2.筛选各异的元素
3.截短流
4.跳过元素

流的扁平化

flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接

给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。为简单起见,你可以用有两个元素的数组来代表数对。

List<Integer> numbers1 = Arrays.asList(1, 2, 3);
List<Integer> numbers2 = Arrays.asList(3, 4);
List<int[]> pairs = numbers1.stream()
        .flatMap(i -> numbers2.stream().map(j -> new int[]{i, j}))
        .collect(toList());

查找和匹配

1.检查谓词是否至少匹配一个元素
if(menu.stream().anyMatch(Dish::isVegetarian)){
    System.out.println("The menu is (somewhat) vegetarian friendly!!");
}
2.检查谓词是否匹配所有元素
boolean isHealthy = menu.stream() allMatch(d -> d.getCalories() < 1000); 
3.查找元素
 Optional<Dish> dish =  menu.stream() .filter(Dish::isVegetarian) .findAny() ;

Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在。在 上面的代码中,findAny可能什么元素都没找到。

4.查找第一个元素
List<Integer> someNumbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> firstSquareDivisibleByThree = someNumbers.stream()
        .map(x -> x * x)
        .filter(x -> x % 3 == 0)
        .findFirst(); // 9 

归约

1.元素求和
int sum = numbers.stream().reduce(0, (a, b) -> a + b); 

reduce接受两个参数:
1.一个初始值,这里是0;
2.一个BinaryOperator<T>来将两个元素结合起来产生一个新值,这里我们用的是
lambda (a, b) -> a + b。
Lambda反复结合每个元素,直到流被归约成一个值。

在Java 8中,Integer类现在有了一个静态的sum方法来对两个数求和,这恰好是我们想要的,用不着反复用Lambda写同一段代码了:

int sum = numbers.stream().reduce(0, Integer::sum); 
2.最大值和最小值
Optional<Integer> max = numbers.stream().reduce(Integer::max); 
Optional<Integer> min = numbers.stream().reduce(Integer::min); 
中间操作和终端操作.png

小结

上一篇 下一篇

猜你喜欢

热点阅读