根据一组数据,先过滤,在排序,再取某个字段的值作为结果;此时该结果中还是基于某个字段排序后的顺序;
/**
* @author Young
* @description 根据一组dish,获取该组dish中少于400卡的,并按照卡正序排列,取所有的dishName;
* @date 14:37 2019/9/28
* @param dishes 入参描述说明
* @return java.util.List<java.lang.String>
**/
public static List<String> getDishName(List<Dish> dishes){
return dishes.stream()
.filter(d->d.getCalories()<400)
.sorted(Comparator.comparing(Dish::getCalories))
.map(Dish::getName)
.collect(Collectors.toList());
}
通过实体类的某个字段进行分组
/**
* @author Young
* @description 根据type进行分组
* @date 14:51 2019/9/28
* @param dishes 入参描述说明
* @return java.util.Map<java.lang.reflect.Type,java.util.List<co.solinx.kafka.monitor.db.Dish>>
**/
public static Map<Type,List<Dish>> getDishByType(List<Dish> dishes){
Map<Type,List<Dish>> result = new HashMap();
for (Dish dish : dishes) {
if (result.containsKey(dish.getType())){
result.get(dish.getType()).add(dish);
}else {
List<Dish> dishList= new ArrayList<>();
dishList.add(dish);
result.put(dish.getType(),dishList);
}
}
return result;
}
/**
* @author Young
* @description use stream to group
* @date 14:58 2019/9/28
* @param dishes 入参描述说明
* @return java.util.Map<co.solinx.kafka.monitor.db.Type,java.util.List<co.solinx.kafka.monitor.db.Dish>>
**/
public static Map<Type,List<Dish>> getDishByTypeStream(List<Dish> dishes){
return dishes.stream().collect(Collectors.groupingBy(Dish::getType));
}
代码的简洁性显而易见
Stream
流是从支持数据处理操作的源生成的元素序列,源可以是数组.文件.集合.函数.流不是集合元素,也不是数据结构,不能保存数据,主要目的就是在于流式计算.
五种生成流的方式
1,通过集合生成,应用中最常见的一种
Stream<Integer> stream = List.stream();
2,通过数组生成
IntStream stream = Arrays.stream(int[]);
通过Arrays.stream方法生成流,并且该方法生成的流是数值流[即IntStream]而不是Stream<Integer>.补充一点使用数值流可以避免计算过程中拆箱装箱,提高性能.
3,通过值生成
Stream<Integer> stram = Stream.of(1,2,3,4);
通过strem的of方法生成流,通过stram的empty方法可以生成一个空流.
4,通过文件生成
Stream<String> lines = Files.lines(Paths.get("data.txt"),Charset.defaultCharset())
通过Files.lines方法得到一个流,并且得到的每个流是给定文件中的一行
5通过函数生成,提供interate和generate两个静态方法从函数中生成流
Stream<Integer> stream = Stream.interate(0,n->n+2).limit(5);
iterate方法接收两个参数,第一个为初始化值,第二个为进行的函数操作,因为interator生成的流为无限流,通过limit方法对流进行截断,只生成5个偶数.
generate
Stream<Double> stream = Stream.generate(Math::random).limit(5)
generate方法接受一个参数,方法参数类型为supplier,由它为流提供值.generate生成的流也是无限流,因此需要limit对流截断