Java8 Stream使用

Java8 Stream使用

Demo1

Class1--->
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Post {
    private long id;
    private String title;
    private boolean available;
    private int readnum;
    private Type type;
    private String author;

    public static enum Type {
        FOOD,
        CAR,
        NEWS,
        PET
    }
}



Class2--->
package com.sm.javastudy.javastream;

import java.util.*;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

public class PostExample {

    static List<Post> posts = Arrays.asList(
            new Post(1, "晒今天做的午餐", true, 25, Post.Type.FOOD, "张三"),
            new Post(2, "xx汽车现已上市", false, 10, Post.Type.CAR, "李雷"),
            new Post(3, "轮胎这样还能用么?", true, 30, Post.Type.CAR, "韩梅梅"),
            new Post(4, "G20最新筹备进展", true, 305, Post.Type.NEWS, "小明"),
            new Post(5, "端午节赛龙舟活动预告", true, 118, Post.Type.NEWS, "张三"),
            new Post(6, "你们家猫咪多久洗一次澡?", true, 56, Post.Type.PET, "小刚"),
            new Post(7, "这样的狗粮不要买", true, 98, Post.Type.PET, "李雷"),
            new Post(8, "教你选疫苗", false, 47, Post.Type.PET, "小红")
    );

    public static void main(String[] args) {

        /**
         * filter 过滤
         * 筛选出阅读数>100的帖子
         */
        List<Post> result1 = posts
                .stream()
                .filter(p -> p.getReadnum() > 100)
                .collect(Collectors.toList());

        /**
         * sorted 排序
         * 根据阅读数排序(从大到小)
         */
        List<Post> result2 = posts
                .stream()
                .sorted(Comparator
                        .comparing(Post::getReadnum)
                        .reversed())
                .collect(Collectors.toList());

        /**
         * map 映射
         * 获取所有标题
         */
        List<String> result3 = posts
                .stream()
                .map(Post::getTitle)
                .collect(Collectors.toList());

        /**
         * 截断 limit
         * 取前5篇帖子
         */
        List<Post> result4 = posts
                .stream()
                .limit(5)
                .collect(Collectors.toList());

        /**
         * distinct 区分
         * 获取所有作者,不重复
         */
        List<String> result5 = posts
                .stream()
                .map(Post::getAuthor)
                .distinct()
                .collect(Collectors.toList());

        /**
         * 跳过元素 skip
         * 跳过前3篇帖子
         */
        List<Post> result6 = posts
                .stream()
                .skip(3)
                .collect(Collectors.toList());

        /**
         * 任意一元素匹配 anyMatch
         * 是否有"小明"发的帖?
         */
        boolean result7 = posts
                .stream()
                .anyMatch(p -> p.getAuthor().equals("小明"));

        /**
         * 是否全部匹配 allMatch
         * 帖子是否阅读量都大于20?
         */
        boolean result8 = posts
                .stream()
                .allMatch(p -> p.getReadnum() > 20);

        /**
         * 全不匹配 noneMatch
         * 是否没有一个帖子是FOOD板块的?
         */
        boolean result9 = posts
                .stream()
                .noneMatch(p -> p.getType().equals(Post.Type.FOOD));

        /**
         * 查找任意一个符合要求的元素 finaAny
         * 查找一个News板块的帖子
         */
        Optional<Post> result10 = posts
                .stream()
                .filter(p -> p.getType().equals(Post.Type.NEWS))
                .findAny();

        /**
         * 查找第一个符合要求的元素 findFirst
         * 查找第一个阅读大于100的帖子的作者
         */
        Optional<String> result11 = posts
                .stream()
                .filter(p -> p.getReadnum() > 100)
                .map(Post::getAuthor)
                .findFirst();

        /**
         * 计数 count
         * 统计这些帖子作者的数量
         */
        long result12 = posts
                .stream()
                .map(Post::getAuthor)
                .distinct()
                .count();

        /**
         * 求这些帖子阅读总数
         */
        int result13 = posts
                .stream()
                .map(Post::getReadnum)
                .reduce(0, Integer::sum);

        //还可以这么写
        int result13_2 = posts
                .stream()
                .mapToInt(Post::getReadnum)
                .sum();

        /**
         * 阅读数最少的帖子的阅读数
         */
        int result14 = posts
                .stream()
                .map(Post::getReadnum)
                .reduce(0, Integer::min);

        /**
         * 阅读数最多未下架的帖子的作者
         */
        Optional<String> result15 = posts
                .stream()
                .filter(Post::isAvailable)
                .max(Comparator.comparing(Post::getReadnum).reversed())
                .map(Post::getAuthor);

        /**
         * 所有上架帖子,按阅读数从小到大
         */
        List<Post> result16 = posts
                .stream()
                .filter(Post::isAvailable)
                .sorted(Comparator.comparing(Post::getReadnum))
                .collect(Collectors.toList());

        /**
         * 李雷在哪些板块发过贴
         */
        List<Post.Type> result17 = posts
                .stream()
                .filter(p -> p.getAuthor().equals("李雷"))
                .map(Post::getType)
                .distinct()
                .collect(Collectors.toList());

        /**
         * 作者名单,用中文逗号隔开
         */
        String result18 = posts
                .stream()
                .map(Post::getAuthor)
                .distinct()
                .reduce("", ((s1, s2) -> s1 + "," + s2));

        /**
         * 把在宠物板块发广告帖(被下架贴)的人随便找一个出来
         */
        Optional<String> result19 = posts
                .stream()
                .filter(p -> !p.isAvailable())
                .filter(p -> p.getType().equals(Post.Type.PET))
                .map(Post::getAuthor)
                .findAny();

        /**
         * 计算张三在美食板块发的贴一共拿了多少点击
         */
        int result20 = posts
                .stream()
                .filter(p -> p.getAuthor().equals("张三"))
                .filter(p -> p.getType().equals(Post.Type.FOOD))
                .map(Post::getReadnum)
                .reduce(0, Integer::sum);

        /**
         * 把这些帖子按板块分组
         */
        Map<Post.Type, List<Post>> result21 = posts
                .stream()
                .collect(groupingBy(Post::getType));

        /**
         * 统计每个版块的帖子数
         */
        Map<Post.Type, Long> result22 = posts
                .stream()
                .collect(groupingBy(Post::getType, counting()));
    }

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值