JAVA8中list.stream()的一些简单使用

这篇具有很好参考价值的文章主要介绍了JAVA8中list.stream()的一些简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

stream的介绍

Stream 中文称为 “流”,通过将集合转换为这么一种叫做 “流” 的元素序列,通过声明性方式,能够对集合中的每个元素进行一系列并行或串行的流水线操作。这种代码更多地表达了业务逻辑的意图,而不是它的实现机制。易读的代码也易于维护、更可靠、更不容易出错。
stream是无存储的。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。

为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
stream只能被使用一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
Stream 就如同一个迭代器,单向,不可往复,数据只能遍历一次,遍历过一次后便失效了。

stream中的一些常用方法

stream中获取某个元素集合

 List<Long> list = preList.stream()
                        .map(Student::getUserId).distinct().collect(Collectors.toList());

当遇到字段为null时,需要进行特殊处理

List<Integer> ages=studentList.stream().map(s -> s.getAge() == null ? "" : s.getAge()).collect(Collectors.toList());

ages.removeAll(Collectors.singleton(""));

将List转换为用逗号隔开的字符串

String str = list.stream().map(String::valueOf).collect(Collectors.joining(","));
//计算计算List对象中某个字段值的总和:
int total = list.stream().mapToInt(User::getAge).sum();

filter(T -> boolean)根据某个属性值获取到该对象

保存boolean部分为true的数据
和list.removeIf()方法刚好相反,removelf中的test方法返回true代表会被过滤掉,而filter中代表会保留下来。

 List<Long> userIdList = preList.stream().filter(a -> id.equals(a.getId()))
                        .map(Student::getUserId).distinct().collect(Collectors.toList());

map(T -> R)将T映射为R

Map<String, String> map = list.stream().collect(Collectors.toMap(Student::getId(), User::getName()));

Map<String, Object> map = list.stream().collect(Collectors.toMap(Student::getId(), t -> t));

distinct(去重)

去掉重复元素,如果是实体类需要我们先在类中定义equals方法,否则无法正确处理。

limit(long n) 返回前n个元素

返回前2个元素

list = list.stream().limit(2).collect(toList());

skip(long n) 去掉前n个元素

去掉前两个元素

list = list.stream().skip(2).collect(toList());

flatMap(T -> Stream) 提取

将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流(例如使用flatMap 提取 List map 提取年龄)

List ages = grades.stream().flatMap(grade -> grade.getStudents().stream()).map(Student::getAge).collect(Collectors.toList());

anyMatch(T -> boolean)

流中是否有一个元素匹配给定的 T -> boolean 条件
allMatch(T -> boolean)
流中是否所有元素都匹配给定的 T -> boolean 条件
noneMatch(T -> boolean)
流中是否没有元素匹配给定的 T -> boolean 条件
最终返回boolean类型

findAny() 和 findFirst() 查找元素

findAny():找到其中一个元素 (使用 stream() 时找到的是第一个元素;使用 parallelStream() 并行时找到的是其中一个元素)
findFirst():找到第一个元素

reduce((T, T) -> T) 和 reduce(T, (T, T) -> T)

第二种方法的第一个T是起始值

//求年龄总和
int sum = list.stream().map(Student::getAge).reduce(0, (a, b) -> a + b);
int sum = list.stream().map(Student::getAge).reduce(0, Integer::sum);
Optional<Integer> sum = list.stream().map(Student::getAge).reduce(Integer::sum);

//求年龄乘积
int sum = list.stream().map(Student::getAge).reduce(1, (a, b) -> a * b);

List根据字段分组

//根据id分组
Map<String, List<Studednt>> resultList = list.stream().collect(Collectors.groupingBy(Studednt::getId));

sorted() / sorted((T, T) -> int)

如果流中的元素的类实现了 Comparable 接口,即有自己的排序规则,那么可以直接调用 sorted() 方法对元素进行排序,如 Stream相反, 需要调用 sorted((T, T) -> int) 实现 Comparator 接口

list = list.stream()
           .sorted((p1, p2) -> p1.getSum() - p2.getSum())
           .collect(toList());

Slf4j中使用log.info打印数组文章来源地址https://www.toymoban.com/news/detail-436182.html

String str =  new ObjectMapper().writeValueAsString(resNodeFirsts);

到了这里,关于JAVA8中list.stream()的一些简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

    对于一个ListMapString, Object类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。 遍历: 过滤: 查询: 去重: 排序: 分组:

    2024年02月10日
    浏览(69)
  • Java8 stream、List forEach 遍历对象 List 对某一字段重新赋值

    Java8 stream、List forEach 遍历对象 List 对某一字段重新赋值 经常会需要遍历对象 List 对某一字段重新赋值,使用 Java8 stream 或者 List forEach 操作实现非常便捷。 一、Java8 stream 操作 示例代码如下: 二、List forEach 操作 示例代码如下: 将 Object 替换为需要提取的对象即可。 遍历对象

    2024年02月16日
    浏览(54)
  • Java8 Stream流List<JSONObject>通过某一属性进行排序

    List对象 1.首先你需要list.parallelStream().sorted 进行流处理,使用parallelStream可以充分调度多核CPU。 2.使用Comparator.comparing进行排序,reversed()进行倒序排列,thenComparing进行下一个排序。 3.Comparator.comparing()里面的内容,也是就是Object::getter,例如Test::getName 4.最后格式化为需要的格式

    2024年02月12日
    浏览(62)
  • java8利用Stream方法求两个List对象的交集、差集与并集(即:anyMatch和allMatch和noneMatch的区别详解)

    1、anyMatch  判断数据列表中是否存在任意一个元素符合设置的predicate条件,如果是就返回true,否则返回false。 接口定义: boolean anyMatch(Predicate? super T predicate); 方法描述: 在anyMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 PredicateT 是接收一个T类型参数,然后经过

    2024年02月06日
    浏览(58)
  • Java8特性,Stream流的使用,收集成为map集合

    Java 8引入了Stream API,这是Java集合操作的一个重大改进。Stream API提供了一种高效且易于使用的处理数据的方式。 Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。注意:Stream自己不会存储元素,它不会改变源对象,反而它的操作会返回一个全新的Strea

    2024年04月22日
    浏览(83)
  • 使用Java8 Stream流中的Collectors.collectingAndThen()方法去重

    Collectors.collectingAndThen() 根据对象属性进行去重操作 Collectors.collectingAndThen()方法属于java8 Stream流中的 java.util.stream.Collectors ,此类实现了 java.util.stream.Collector 接口,还提供了大量的方法对Stream流中的元素进行 map 和 reduce 操作 在获取任务的时候,会出现id重复的状况,利用 Co

    2024年02月09日
    浏览(62)
  • java8新特性Stream流中anyMatch和allMatch和noneMatch的使用!!!

    判断数据列表中是否存在任意一个元素符合设置的predicate条件,如果是就返回true,否则返回false。 接口定义: boolean anyMatch(Predicate? super T predicate); 方法描述: 在anyMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 PredicateT 是接收一个T类型参数,然后经过逻辑验证返

    2024年02月08日
    浏览(58)
  • Java8 Stream流的合并

    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id: id1 , id2 , id3 ,要把这些Id全部取出来,然后去数据库里查询它们是否存在。 通常情况下,我们都是从集合中取出对象的某一个字段,像这样: 现在要取3个字段,

    2024年02月02日
    浏览(53)
  • Java8中Stream详细用法大全

    Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda ,给我们操作集合(Collection)提供了极大的便利。Stream流是JDK8新增的成员,允许以声明性方式处理数据集合,可以把Stream流看作是遍历数据集合的一个高级迭代器。Stream 是 Java8 中处理集合的关键抽

    2023年04月08日
    浏览(79)
  • Java8 函数式编程stream流

    Java 8 中新增的特性旨在帮助程序员写出更好的代码,其中对核心类库的改进是很关键的一部分,也是本章的主要内容。对核心类库的改进主要包括集合类的 API 和新引入的流(Stream),流使程序员得以站在更高的抽象层次上对集合进行操作。下面将介绍stream流的用法。 ​场景

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包