java8的Stream

使用流的三件事:
1.一个数据源(如集合)来执行一个查询
2.一个中间操作链,形成一条流的流水线
3.一个终端操作,执行流水线并能生成结果

数据源常用:
Arrays.asList()   把括号里的东西变成list,返回一个List,里面东西用,分隔。


创建流:
Stream<String> stream = Stream.of("a", "b", "c", "d");
Stream<String> emptyStream = Stream.empty();
Arrays.stream(参数)
Files.lines( )    由文件产生一个流,每一行都是一个元素
Stream.iterate(0, n -> n+2)    一个偶数流(无限流)
Stream.generate(Math :: random)     生成一个随机流

IntStream.range(n,m)          产生n到m的整数的流,不包含n,m
IntStream.rangeClosed(n,m)    产生n到m的整数的流,包含n,m

stream()   做流处理
parallelStream()     并行执行的流


可以连接起来的流操作称为中间操作
filter()    Lambda表达式,相当于过滤,筛选出符合某种条件的
map()   将元素转换成其他形式或提取信息
limit()  截断流,使其元素不超过指定数量
sorted()  

distinct()  

boxed()             将特化的流(如IntStream)转换为非特化的流(Stream)


关闭流的操作称为终端操作
collect()   将流转换为其他形式
forEach()   返回void的终端操作

count()     返回流中元素的个数(long)

anyMatch(表达式)    流中是否有至少一个元素匹配给定的谓词, 返回的是boolean,是终端操作
allMatch(表达式)    流中是否所有元素都能匹配给定的谓词
noneMatch(表达式)   和allMatch相反
findAny()           返回当前流中的任意元素
findFirst()         返回当前流的第一个元素
reduce()            归约,可以做求和,最大最小等。
例:
int sum = numbers.stream().reduce(0, (a, b) -> a + b)  0是初始值
int sum = numbers.stream().reduce(0, Integer :: sum)   sum是Integer中的方法
int sum = numbers.stream().reduce((a, b) -> a + b)     不接受初始值


收集器
.collect(Collectors.counting())      收集数量,返回long
.collect(Collectors.maxBy(表达式))     最大值
.collect(summingInt(表达式))          求和
.collect(summingDouble(表达式))
.collect(summingLong(表达式))
.collect(averagingInt(表达式))      平均值
.collect(summarizingInt(表达式))     返回一个IntSummaryStatistics类型的值,里面包含了count,sum,min,average,max,可以用getter方法取值
.collect(joining("可以选填分隔符"));    连接字符串,内部用的是StringBuilder
.collect(reducing(0, Dish::getCalories, (i, j) -> i + j))      将归约普遍化,处理特殊情况
.collect(groupingBy(表达式),选填收集器类型的第二个参数);          将流分组,返回Map,键是分组的标准, 值是分出来的结果集,如果加上第二个参数,可以再放一groupingBy做下一级的分组,或者count(), 能统计出每组的个数等方法,第二个收集器里也可以放collectingAndThen(),包裹第三个收集器
.collect(partitioningBy(表达式));     分区,返回的是一个map,表达式的值是返回布尔的, 因此map 的键只有true和false这两个区,同样可以产生第二个、第三个收集器



package java8;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 版权所有(C) 2017 上海银路投资管理有限公司
 * 描述:
 * 作者: ChengShanyunduo
 * 创建日期: 2017-10-25
 * 修改记录:
 */
public class Unit4 {


    public static void main(String[] args){
        List<Dish> menu = Arrays.asList(
                new Dish("pork", false, 800, Dish.Type.MEAT),
                new Dish("beef", false, 700, Dish.Type.MEAT),
                new Dish("chicken", false, 400, Dish.Type.MEAT),
                new Dish("french", true, 530, Dish.Type.OTHER),
                new Dish("rice", true, 350, Dish.Type.OTHER),
                new Dish("season", true, 120, Dish.Type.OTHER),
                new Dish("pizza", true, 550, Dish.Type.OTHER),
                new Dish("prawns", false, 300, Dish.Type.FISH),
                new Dish("salmon", false, 450, Dish.Type.FISH)
        );
        List<String> threeHighCaloricDishNames = menu.stream().filter(d -> d.getCalories() > 300).map(Dish :: getName).limit(3).collect(Collectors.toList());
        System.out.println(threeHighCaloricDishNames);
        List<String> names = menu.stream().map(Dish :: getName).collect(Collectors.toList());
        System.out.println(names);
        menu.stream().forEach(System.out :: println);
    }
}


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页