Java 8 Stream

本文详细介绍了Java8中Stream API的使用方法,包括filter、forEach、distinct、limit、sort、map、toMap、groupingBy及summary等核心操作。通过具体示例,展示了如何对Article对象列表进行过滤、去重、限制、排序、映射、转换为Map、分组统计以及求和、求平均等统计操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单的使用下Java 8 的新特性Stream

使用Entity Article作为具体的对象。包含标题 作者 创建时间 文章字数等字段。

主要方法有

  • filter
  • forEach
  • distinct
  • limit
  • sort
  • map
  • toMap
  • groupingBy
  • summary

 

package com.zzj.stream;

import java.util.Date;
import java.util.Objects;

public class Article {
    private String title;
    private String writer;
    private Date createtime;
    private int words;

    public Article(String title, int words) {
        this.title = title;
        this.words = words;
    }

    public Article() {
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getWriter() {
        return writer;
    }

    public void setWriter(String writer) {
        this.writer = writer;
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public int getWords() {
        return words;
    }

    public void setWords(int words) {
        this.words = words;
    }


    /**
     * 重写equals方法,用于stream的distinct去重对比
     * @param obj
     * @return
     */
    @Override
    public boolean equals(final Object obj) {
        if (obj == null) {
            return false;
        }
        final Article article = (Article) obj;
        if (this == article) {
            return true;
        } else {
            return (this.title.equals(article.title) && this.words == article.words);
        }
    }
    @Override
    public int hashCode() {
        return Objects.hash(title, words);
    }

}

具体的使用样例和说明

package com.zzj.stream;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ZZZTest {

    public static void main(String[] args) {


        /**
         *      方法引用使用一对冒号 ::
                构造方法引用: 类::new
                静态方法引用:类::静态方法
                实例方法引用:类::实例方法  或者  对象::实例方法
         */
        List<Article> list = new ArrayList<Article>();

        list.add(new Article("小说AA",45000));
        list.add(new Article("小说BB",9000));
        list.add(new Article("小说CC",20000));
        list.add(new Article("小说DD",550000));
        list.add(new Article("小说EE",40000));
        list.add(new Article("小说EE",40000));
        list.add(new Article("小说EE",60000));
        list.add(new Article("小说FF",40000));

        Stream<Article> stream = list.stream();
        stream = list.parallelStream();//并行流方法,可以让数据集执行并行操作
        //循环list打印全部信息
        list.stream().forEach((listArticle) -> System.out.println(listArticle.getTitle()+ "," + listArticle.getWords()));

        System.out.println("------------filter---------------");
        //filter
        //使用filter过滤调一些数据:
        // 除去words大于25000的Article,然后打印
        List<Article> filterList = list.stream().filter(article -> article.getWords() > 25000).collect(Collectors.toList());
        filterList.stream().forEach((filterArticle) -> System.out.println(filterArticle.getTitle()+ "," + filterArticle.getWords()));

        System.out.println("------------distinct---------------");
        //distinct
        List<Article> mutiList = null;
        long all = list.stream().count();
        long norepeat = list.stream().distinct().count();
        System.out.println("全部数量:" + all + ",去重之后的数量:" + norepeat);

        System.out.println("-------------limit--------------");
        //limit
        long limitCount = list.stream().limit(3).count();
        List<Article> limitList = list.stream().limit(3).collect(Collectors.toList());
        System.out.println("limitCount is " + limitCount );
        limitList.stream().forEach(limitArticle -> System.out.println(limitArticle.getTitle() + " --normal-- " + limitArticle.getWords()));

        System.out.println("-------------sort--------------");
        //sort
        //从小到大: 通过 :: 选择符 选择对象的某个字段进行排序 ,此处选择的是words字数
        List<Article> sortList = list.stream().sorted(Comparator.comparing(Article::getWords)).collect(Collectors.toList());
        sortList.stream().forEach(sortedArticle -> System.out.println(sortedArticle.getTitle() + "--" + sortedArticle.getWords()));

        //倒序  从大到小
        sortList = list.stream().sorted(Comparator.comparing(Article::getWords).reversed()).collect(Collectors.toList());
        sortList.stream().forEach(sortedArticle -> System.out.println(sortedArticle.getTitle() + "--reverse--" + sortedArticle.getWords()));

        //按照文字/字母顺序排序 abcd....
        sortList = list.stream().sorted(Comparator.comparing(Article::getTitle)).collect(Collectors.toList());
        sortList.stream().forEach(sortedArticle -> System.out.println(sortedArticle.getTitle() + "--character--" + sortedArticle.getWords()));
        //插播一个单词释义
        /**
        在牛津高阶英语词典中,对于character的其中一个与letter有关的解释是:
         character means a letter, sign, mark or symbol used in writing。
         由此可见letter是包含在character中的,character可以表示中国的文字,
         也可以表示字母、符号、记号等。而字典中对于letter的定义是字母的意思,
         比如 ‘B’is the second letter of the alphabet. 这也从侧面证明了letter只是字母的意思,是character的一部分。
        比如:一句话里除了有字母或者文字还可以有标点符号,这些都成为character。 而letter只是字母。
        */
        System.out.println("-------------map--------------");
        List<String> mapList = list.stream().map(Article::getTitle).collect(Collectors.toList());
        mapList.stream().forEach(generalString -> System.out.println(generalString));

        System.out.println("-------------toMap--------------");
        //toMap 转换成map ,第一个是key,第二个是value,第三个参数表示如果存在相同的key,那么使用newValue作为值,或者使用表达式来判断
        Map<String,Object> mapObject = list.stream().collect(Collectors.toMap(Article::getTitle,Article::getWords,(oldValue,newValue) -> newValue));
        //默认的情况下,如果存在相同的key会报错
        //Map<String,Object> mapObject = list.stream().collect(Collectors.toMap(Article::getTitle,Article::getWords));
        //Function.identity 代表的是原型,此处代表把 List<Article> list这个循环体内的每一个Article对象实例作为value,,也可以换成对象指向article -> article
        // Map<String,Article> mapIdentityButMultiple = list.stream().collect(Collectors.toMap(Article::getTitle,Function.identity())); //key重复
        // Map<String,Article> mapIdentityOrigin = list.stream().collect(Collectors.toMap(Article::getTitle,article -> article));//key重复
        Map<String,Article> mapIdentityJudge = list.stream().collect(Collectors.toMap(Article::getTitle,Function.identity(),(oldArticle,newArticle) -> {
                //当key重复的时候,对比新旧value对象的words大小,取最大的作为value
            System.out.println("oldArticle.words is " + oldArticle.getWords());
            System.out.println("newArticle.words is " + newArticle.getWords());
                if(oldArticle.getWords()>newArticle.getWords()){
                    return oldArticle;
                }else{
                    return newArticle;
                }
                //或者直接三元表达式
                //return oldArticle.getWords()>newArticle.getWords()?oldArticle:newArticle;
            }
        ));


        System.out.println("-------------groupingBy--------------");
        //按照title字段 分组 把key相同的article对象放到一个list中,然后放入mapKeyList集合中去
        Map<String, List<Article>> mapKeyList = list.stream().collect(Collectors.groupingBy(Article::getTitle));
        //按照title字段 分组 统计key相同的数量,然后放入mapCount集合中去
        Map<String, Long> mapCount = list.stream().collect(Collectors.groupingBy(Article::getTitle, Collectors.counting()));
        //按照title字段 分组 然后把article的words字段放入set中去重复,然后把set结果集 作为value 放入到mapSet中
        Map<String, Set<Integer>> mapSet = list.stream().collect(Collectors.groupingBy(Article::getTitle, Collectors.mapping(Article::getWords, Collectors.toSet())));

        System.out.println("-------------summary--------------");
        //按照article的words统计数据,分别求出最大 最小 平均数 全部求和
        IntSummaryStatistics summaryStatistics = list.stream().mapToInt(Article::getWords).summaryStatistics();
        System.out.println(summaryStatistics.getMax());
        System.out.println(summaryStatistics.getMin());
        System.out.println(summaryStatistics.getAverage());
        System.out.println(summaryStatistics.getSum());

    }
}

代码已经上传,可参见

Stream样例代码

 

### Java 8 Stream API 使用教程 #### 创建流 创建流的方式有多种,可以通过集合类的 `stream()` 方法获取流实例。 ```java List<String> list = Arrays.asList("apple", "banana", "orange"); Stream<String> stream = list.stream(); ``` 对于数组,则可以使用静态方法 `Arrays.stream` 或者 `Stream.of`. ```java String[] array = {"apple", "banana", "orange"}; Stream<String> streamFromArray = Arrays.stream(array); // or Stream<String> streamOfArray = Stream.of(array); ``` #### 中间操作 中间操作返回一个新的流对象,在此之后还可以继续调用其他的操作。常见的中间操作包括但不限于: - **filter**: 过滤掉不符合条件的元素[^1] ```java Stream<String> filteredStream = stream.filter(s -> s.startsWith("a")); ``` - **map**: 将每一个输入元素按照指定映射关系转换成另一个输出元素 ```java Stream<Integer> lengthStream = stream.map(String::length); ``` - **peek**: 对每个元素执行某些动作并传给下游,通常用于调试目的[^2] ```java Stream<String> peekedStream = stream.peek(System.out::println); ``` #### 终端操作 终端操作会触发实际计算过程,并关闭流。一旦执行了一个终端操作后就不能再对该流做任何进一步的操作了。一些常用的终端操作如下所示: - **forEach**: 遍历整个序列中的每一项 ```java stream.forEach(System.out::println); ``` - **collect(Collectors.toList())**: 收集结果到列表中 ```java List<String> resultList = stream.collect(Collectors.toList()); ``` - **count()**: 计算总数目 ```java long count = stream.count(); ``` 这些只是基础部分;实际上还有更多高级特性和组合方式等待探索。通过合理运用上述概念以及所提供的例子,应该能更好地理解如何利用Java Streams简化日常开发工作流程的同时提高效率和代码质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值