Java 8 的新特性Stream,以及Java7的Fork/Join框架

Java 8 的新特性Stream,以及Java7的Fork/Join框架

一、流

  • 流像一个延迟创建的集合
  • 流只能消费一次
  • 流利用了内部迭代

二、流的操作

流的操作分为:中间操作、终端操作。

流的延迟特性:中间操作可以连成一个操作流水线,除非发出一个终端操作,中间操作不会执行任何处理。

利用延迟特性:短路、循环合并。

2.1 筛选、去重、截断、跳过

  • filter()
  • distinct() 根据 hashCode() 和 equals() 去除
  • limit() 截断
  • skip() ,跳过前面n个元素,和limit() 截然相反

2.2 映射:map、flatMap

  • map 映射: 根据一个元素,创建出一个新的元素
  • flatMap 扁平化:把一个流中的每一个值都换成另一个流,然后把所有流连接起来成为一个流。
String[] words = {"hello", "world"};
// [h, e, l, l, o, w, o, r, l, d]
List<String> charList = Arrays.stream(words).map(item -> item.split("")).flatMap(Arrays::stream).collect(Collectors.toList());

题目:

给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应

该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。为简单起见,你可以用有两个元素的数组来代

表数对。
Integer[][] aa = {
  {1, 2, 3},{3, 4}};
        List<Integer[]> pairs = Arrays.stream(aa[0])
                .flatMap(i -> Arrays.stream(aa[1])
                        .map(j -> new Integer[]{i, j})
                ).collect(Collectors.toList());

2.3 查找和匹配

匹配

  • anyMatch() 检查是否至少匹配一个元素,返回boolean
  • allMatch() 检查是否匹配所有元素,返回boolean
  • noneMath() 流中没有任何元素与给定的判断匹配

查找

  • findAny() 返回任意一个
  • findFirst() 查找第一个元素

2.4 归约 reduce

求和:

List<Integer> a = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 8));
Integer res = a.stream().reduce(0, (i, j) -> i + j);
Integer res1 = a.stream().reduce(0, Integer::sum);
Optional<Integer> res2 = a.stream().reduce(Integer::sum);
System.out.println(res2.orElse(0));

最大值和最小值:

Optional<Integer> maxOptional = a.stream().reduce(Integer::max);
System.out.println(maxOptional.orElse(0));
Optional<Integer> minOptional = a.stream().reduce(Integer::min);
System.out.println(minOptional.orElse(0));

使用流中内置的方法统计个数:

long count = a.stream().count();

2.5 数值流

  • 原始类型流特化:避免装箱成本。IntStream、DoubleStream、LongStream。
  • 映射为数值流: mapToInt() ,返回一个IntStream
  • 转回对象流:intStream.boxed()
  • 数值范围:通过数值流, intStream.range() 和 intStream.rangeClosed()

2.6 创建流

  • 由值创建流

    Stream<Integer> stream = Stream.of(2, 3, 4, 5, 6);
    
  • 由数组创建流

    Stream<Integer> stream1 = Arrays.stream(new Integer[]{3, 5, 6, 7});
    
  • 由文件生成流

    // 由文件生成流
            String filePath ="pom.xml";
            try (Stream<String> fileStream = Files.lines(Paths.get(filePath), Charset.defaultCharset())){
                long count = fileStream.flatMap(line -> Arrays.stream(line.split(" "))).count(
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值