Java8中流的使用

1. 引入流

流是Java API的新成员,它允许你以声明式方式处理数据集合。就现在来说,你可以把它看成遍历数据集的高级迭代器。

流操作

java.util.stream.Stream中的stream接口定义了许多操作。它们可以被分为两大类:中间操作终端操作。可以被连接起来的流操作称为中间操作,关闭流的操作称为终端操作

  • filter、map和limit可以连成一条流水线

  • collect触发流水线执行并关闭它

    中间操作:filter,map、limit、distinct、sorted等,返回一个流,不会单独执行处理,除非遇到终端操作

    终端操作:从流中返回一个结果,结果是任何非流的值,例如:collect、count

流的使用一般包括三件事:

  • 一个数据源(如集合)来执行一个查询;
  • 一个中间操作链,形成一条流的流水线;
  • 一个终端操作,执行流水线,并能生成结果。

流的中间操作和终端操作:
流的中间操作和终端操作

2.使用流

2.1 筛选、切片

2.1.1筛选

用谓词筛选

Stream接口支持filter方法。该操作会接受一个谓词作为参数,并返回一个包括所有符合谓词的元素的流。

例如:

List<Dish> vegetarianMenu = menu.stream()
                                .filter(Dish::isVegetarian)
                                .collect(toList());
筛选各异的元素

流支持distinct方法,它会返回一个元素各异的流。例如,以下代码会筛选出列表中所有的偶数,并确保没有重复。

List<Integer> numbers = Arrays.asList(1,2,1,3,3,2,4);
numbers.stream()
        .filter(i -> i%2 ==0)
        .distinct()
        .forEach(System.out::println);
截短流

流支持limit(n)方法,该方法会返回一个不超过给定长度n的流。

例如:

List<Dish> dishes = menu.stream()
            .filter(d -> d.getCalories() > 300)
            .limit(3)
            collect(toList());
跳过元素

流还支持skip(n)方法,返回一个扔掉前n个元素的流。如果流元素不足n个则返回一个空流。

例如:

List<Dish> dishes = menu.stream()
            .filter(d -> d.getCalories() > 300)
            .skip(2)
            collect(toList());

2.2 映射

对流中每一个元素应用函数

流支持map方法,它会接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素。

例1:

//提取菜肴名称
List<String> dishNames = menu.stream()
            .map(Dish::getName)
            .collect(toList());
流的扁平化

对于一个单词表,如何返回一张列表,列出里面各不相同的字符?例如给定单词列表[“Hello”,“World”],要返回列表[“H”,“e”,“l”,“o”,“W”,“r”,“d”]。

最开始的版本可能是这样的:

words.stream()
    .map(word -> word.split(""))
    .collect(toList());
</
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,流(Stream)是一种用于操作集合(Collections)或数组的抽象概念。它提供了一种统一的、流畅的操作方式,可以对数据进行过滤、映射、排序、聚合等操作,使得代码更加简洁和可读。 流的使用通常可以分为以下几个步骤: 1. 创建流:可以通过集合、数组、文件等方式创建流对象。常见的创建方式包括 `stream()` 方法、`Arrays.stream()` 方法和 `Files.lines()` 方法等。 2. 中间操作:流支持一系列的中间操作,用于对数据进行转换、过滤等操作,这些操作都会返回一个新的流。常见的中间操作包括 `filter()`、`map()`、`sorted()`、`distinct()` 等。 3. 终端操作:终端操作是对流进行最终的处理操作,它会产生一个结果或者一个副作用。常见的终端操作包括 `forEach()`、`collect()`、`reduce()`、`count()` 等。终端操作是流的触发点,执行终端操作后,流将不可再次使用。 下面是一个示例代码,展示了如何使用流对集合进行筛选和转换: ```java List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> evenSquares = numbers.stream() .filter(n -> n % 2 == 0) // 筛选偶数 .map(n -> n * n) // 平方 .collect(Collectors.toList()); // 转换为列表 System.out.println(evenSquares); // 输出 [4, 16, 36, 64, 100] ``` 在这个示例中,我们首先通过 `stream()` 方法创建了一个流,然后使用 `filter()` 方法筛选出偶数,接着使用 `map()` 方法对每个元素进行平方操作,最后使用 `collect()` 方法将结果收集到一个列表中。 通过使用流,我们可以以一种更简洁和链式的方式对集合进行操作,提高了代码的可读性和可维护性。同时,流还提供了并行处理的能力,可以充分利用多核处理器的性能优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值