根據一組數據,先過濾,在排序,再取某個字段的值作爲結果;此時該結果中還是基於某個字段排序後的順序;
/**
* @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對流截斷