Java 8 Stream in Action

2019-12-01  本文已影响0人  但时间也偷换概念

引言

本篇博客主要基于<Java 8 in Action>、<Java 8函数式编程>等书总结一下Stream流概况。

一:流是什么?

首先来看一下声明性方式处理数据集合带来的差异。

首先我们一个实体类型Dish

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@AllArgsConstructor
@Setter
@Getter
@ToString
public class Dish {
    private String name;
    private boolean vegetarian;
    private int calories;
    private Type type;

    public enum Type {MEAT, FISH, OTHER}
}

然后我们试着mock一个Dish集合,menu。我们要进行的操作是将menu中所有calories小于400的Dish name有序集合返回。

集合处理

         // java 7 in Action
        List<Dish> menu = Lists.newArrayList();
        List<Dish> lowCaloricDishes = Lists.newArrayList();
        for (Dish d : menu) {
            if (d.getCalories() < 400) {
                lowCaloricDishes.add(d);
            }
        }

        Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
            @Override
            public int compare(Dish o1, Dish o2) {
                return Integer.compare(o1.getCalories(), o2.getCalories());
            }
        });

        List<String> lowCaloricDishesName = Lists.newArrayList();
        for (Dish d : lowCaloricDishes) {
            lowCaloricDishesName.add(d.getName());
        }

流处理

       // java 8 in Action
        menu.stream()
                .filter(d -> d.getCalories() < 400)
                .sorted(Comparator.comparing(Dish::getCalories))
                .map(Dish::getName)
                .collect(Collectors.toList());

并行流处理

       // java 8 in action
        menu.parallelStream()
                .filter(d -> d.getCalories() < 400)
                .sorted(Comparator.comparing(Dish::getCalories))
                .map(Dish::getName)
                .collect(Collectors.toList());

总结一下以上代码。

Java 7 in Action
Java 8 in Action

二:流简介

简短定义

"从支持数据处理操作的源生成的元素序列"

三:流与集合

粗略的说:"流和集合之间的差异在于什么时候进行计算,还有遍历的方式"

        Stream<Dish> stream = menu.stream();
        stream.collect(Collectors.toList());
        stream.collect(Collectors.toList());

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at com.zhengyu.stream.StreamAction.main(StreamAction.java:39)

四:流操作

流的使用一般包括三件事
   // java 8 in action
        menu.stream()
                .filter(d -> d.getCalories() < 400)
                .sorted(Comparator.comparing(Dish::getCalories))
                .map(Dish::getName)
                .collect(Collectors.toList());

可以看到两类操作:

在中间操作中,还会有短路技巧与循环合并技术,能够按需计算,减少遍历的次数。

    // java 8 in action
        menu.stream()
                .filter(d -> {
                    System.out.println("filtering" + d.getName());
                    return d.getCalories() < 400;
                })
                .sorted(Comparator.comparing(Dish::getCalories))
                .map(d -> {
                    System.out.println("mapping" + d.getName());
                    return d.getName();
                })
                .limit(3)
                .collect(Collectors.toList());

如上述代码,由于limit和短路,加上filter和map循环合并。
最终只会打印三条filtering和mapping日志。

image.png
上一篇 下一篇

猜你喜欢

热点阅读