JDK1.8 -- Stream应用示例

package com.liutao.java8;

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

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

/**
 * @author: LIUTAO
 * @Date: Created in 2019/6/4  10:00
 * @Modified By:
 */
public class Data {
    private static List<PersonModel> list;

    static {
        PersonModel wu = new PersonModel("wu qi", 18, "男");
        PersonModel zhang = new PersonModel("zhang ba", 19, "男");
        PersonModel wang = new PersonModel("wang si", 20, "女");
        PersonModel zhao = new PersonModel("zhao wu", 20, "男");
        PersonModel chen = new PersonModel("chen liu", 21, "男");
        PersonModel chenTwo = new PersonModel("chen liu", 22, "男");
        list = Arrays.asList(wu, wang, zhang, zhao, chen, chenTwo);
    }

    public static List<PersonModel> getList() {
        return list;
    }

    /**
     * 演示filter的使用
     * <p>
     * (1)遍历数据并检测其中的元素时使用。
     * (2)filter接受一个函数作为参数,该函数用Lambda表达式表示。
     */
    public static void testFilter() {
        List<PersonModel> data = Data.getList();

        //old,过滤所有男性
        List<PersonModel> temp = new ArrayList<>();
        for (PersonModel p : data) {
            if ("男".equals(p.getSex())) {

                temp.add(p);
            }
        }
        System.out.println(temp);

        //new,过滤所有女性
        temp = data
                .stream()
                .filter(personModel -> "女".equals(personModel.getSex()))
                .collect(toList());
        System.out.println(temp);
    }

    /**
     * 演示map的使用
     * <p>
     * (1)map生成的是一个一对一的映射,for的作用
     * (2)比较常用
     * (3)而且简单
     */
    public static void testMap() {
        List<PersonModel> data = Data.getList();

        //获取所有name
        List<String> names = data.stream().map(PersonModel::getName).collect(toList());
        System.out.println(names);
    }

    /**
     * 演示distinct的使用
     * <p>
     * 去除重复元素,这个方法是通过类的equals方法来判断两个元素是否相等
     */
    public static void testDistinct() {
        List<PersonModel> data = Data.getList();
        System.out.println(data.stream().distinct().collect(toList()));
    }

    /**
     * 演示sorted的使用
     * <p>
     * 如果流中元素的类实现了Comparable接口,即有自己的排序规则,则可以直接调用sorted()函数对元素进行排序,
     * 反之, 需要调用 sorted((T, T) -> int) 实现 Comparator 接口
     */
    public static void testSorted() {
        List<PersonModel> data = Data.getList();
        System.out.println(data.stream().sorted().collect(toList()));
        System.out.println(data.stream().sorted(Comparator.comparing(PersonModel::getName)).collect(toList()));
    }

    /**
     * 演示limit(long n)的使用
     * <p>
     * 返回前n个元素
     */
    public static void testLimit() {
        List<PersonModel> data = Data.getList();
        System.out.println(data.stream().limit(1).collect(toList()));
    }

    /**
     * 演示skip(long n)的使用
     * <p>
     * 去除前n个元素
     */
    public static void testSkip() {
        List<PersonModel> data = Data.getList();
        System.out.println(data.stream().skip(5).collect(toList()));
    }


    /**
     * 演示flatMap的使用
     * <p>
     * 将流中每一个元素T映射成一个流,再把每一个流连接成一个流
     */
    public static void testFlatMap() {
        List<String> list = new ArrayList<>();
        list.add("aaa bbb ccc");
        list.add("ddd eee fff");
        list.add("ggg hhh iii");
        List<String[]> str = list.stream().map(s -> s.split(" ")).collect(Collectors.toList());
        System.out.println(str);

        System.out.println(str.stream().flatMap(Arrays::stream).collect(Collectors.toList()));
    }

    /**
     * 演示anyMatch(T -> boolean)函数的使用
     *
     * 流中是否有一个元素匹配T -> boolean条件
     * 对应的其他函数如下:
     * allMatch(T -> boolean):流中是否所有元素匹配T -> boolean条件
     * noneMatch(T -> boolean):流中是否没有元素匹配T -> boolean条件
     */
    public static void testAnyMatch(){
        List<PersonModel> data = Data.getList();
        System.out.println(data.stream().allMatch(personModel -> personModel.getAge() != null & personModel.getAge() > 30));
    }


    /**
     * 演示findAny()的使用
     *
     * 找到其中一个元素 (使用 stream() 时找到的是第一个元素;使用 parallelStream() 并行时找到的是其中一个元素)
     * findFirst():找到第一个元素
     */
    public static void testFindAny(){
        List<PersonModel> data = Data.getList();
        Optional<PersonModel> optional = data.stream().findAny();
        System.out.println(optional.get());
    }

    /**
     * 演示reduce的使用
     * <p>
     * 用于组合流中的元素,如求和,求积,求最大值等
     */
    public static void testReduce() {
        List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6);
        Integer reduce = nums.stream().reduce(0, (x, y) -> x + y);
        System.out.println(reduce);
    }

    /**
     * 演示collect的使用
     * collect在流中生成列表、map等常用数据结构
     */
    public static void testCollect() {
        List<PersonModel> data = Data.getList();

        //生成list
        List<String> names = data.stream().map(PersonModel::getName).collect(toList());
        System.out.println(names);

        //生成set
        Set<String> sexs = data.stream().map(PersonModel::getSex).collect(toSet());
        System.out.println(sexs);

        //生成map
        Map<String, Integer> map = data.stream().collect(toMap(PersonModel::getName, PersonModel::getAge));
        System.out.println(map);

        //指定类型
        TreeSet<PersonModel> personModels = data.stream().collect(toCollection(TreeSet::new));
        System.out.println(personModels);

        //分组
        Map<Boolean, List<PersonModel>> collect = data.stream().collect(Collectors.groupingBy(per -> "男".equals(per.getSex())));
        System.out.println(collect);

        //分隔
        String str = data.stream().map(PersonModel::getName).collect(joining(",", "{", "}"));
        System.out.println(str);
    }

    /**
     * 演示Optional的使用
     * <p>
     * Optional是为核心类库新设计的一个数据类型,用来替换null。
     */
    public static void testOptional() {
        PersonModel personModel = new PersonModel();

        //对象为空则打印出 -,personModel不能为空,否则报错
        Optional<Object> o = Optional.of(personModel);
        System.out.println(o.isPresent() ? o.get() : "-");

        //名称为空则打印出 - ,此处的名称可以为空
        Optional<String> name = Optional.ofNullable(personModel.getName());
        System.out.println(name.isPresent() ? name.get() : "-");

        //如果不为空,则打印出xxx
        Optional.ofNullable("test").ifPresent(na -> System.out.println(na + "ifPresent"));

        //如果空,则返回指定字符串
        System.out.println(Optional.ofNullable(null).orElse("-"));
        System.out.println(Optional.ofNullable("1").orElse("-"));


        //如果空,则返回指定方法,或者代码
        System.out.println(Optional.ofNullable(null).orElseGet(() -> {
                    return "hahaha";
                }
        ));

        System.out.println(Optional.ofNullable("1").orElseGet(() -> {
                    return "hahaha";
                }
        ));

    }

    /**
     * 演示parallelStream的使用
     * <p>
     * 输出为:
     * old:48
     * syn:1846
     * con:172
     * 从上面的输出结果我们可以看到,con的速度要比syn快很多
     */
    public static void testParallelStream() {
        List<Integer> list = new ArrayList<>();
        for (Integer i = 0; i < 10000000; i++) {
            list.add(i);
        }

        //old
        List<Integer> temp1 = new ArrayList<>(10000000);
        long start = System.currentTimeMillis();
        for (Integer i : list) {
            temp1.add(i);
        }
        System.out.println("old:" + (System.currentTimeMillis() - start));

        //同步
        long start1 = System.currentTimeMillis();
        list.stream().collect(Collectors.toList());
        System.out.println("syn:" + (System.currentTimeMillis() - start1));

        //并发
        long start2 = System.currentTimeMillis();
        list.parallelStream().collect(Collectors.toList());
        System.out.println("con:" + (System.currentTimeMillis() - start2));
    }

    public static void main(String[] args) {
//        testFilter();
//        testMap();
//        testReduce();
//        testCollect();
//        testOptional();
//        testParallelStream();
//        testDistinct();
//        testSorted();
//        testLimit();
//        testSkip();
//        testFlatMap();
//        testAnyMatch();
        testFindAny();

        /**
         * 其余的函数
         * count():返回流中元素个数,结果为 long 类型
         * forEach():遍历元素
         *
         */
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值