java8新特性Demo

具体内容可以看下面这篇博客
java8新特性

package lambda;

import org.junit.Test;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Description:
 * @Author: wuk
 * @CreateDate: 2020/3/20 11:04
 * @UpdateDate: 2020/3/20 11:04
 * @UpdateRemark: init
 * @Version: 1.0
 * @menu
 */
public class StreamDemo {


    List<Person> list = new ArrayList<Person>() {{

        add(new Person("a 1", 20, new BigDecimal(5000)));
        add(new Person("b 3", 25, new BigDecimal(6000)));
        add(new Person("c 4", 22, new BigDecimal(5000)));
        add(new Person("d 5", 26, new BigDecimal(2300)));
        add(new Person("e 6", 13, new BigDecimal(6500)));
        add(new Person("f 7", 65, new BigDecimal(4300)));
        add(new Person("h 8", 65, new BigDecimal(5700)));
        add(new Person("u 9", 5, new BigDecimal(7000)));
        add(new Person("a 2", 20, new BigDecimal(5000)));
    }};

    /**
     * 筛选与切片
     */

    /**
     * filter-过滤
     */
    @Test
    public void test01() {
        list.stream()
                .filter((person -> person.getAge() > 30))
                .forEach(System.out::println);
    }

    /**
     * limit-限定元素数量
     */
    @Test
    public void test02() {
        list.stream()
                .filter((person -> person.getAge() > 30))
                .limit(2)
                .forEach(System.out::println);
    }

    /**
     * skip-跳过元素 跳过前n个
     * 注意:返回一个跳过前n个元素的流,若流中元素不足n个,则返回一个空流
     */
    @Test
    public void test03() {
        list.stream()
                .filter((person -> person.getAge() > 30))
                .skip(2)
                .forEach(System.out::println);
    }

    /**
     * distinct-去重
     * 注意:生成重写hashCode()和equals()方法
     */
    @Test
    public void test04() {
        list.stream()
                .distinct()
                .forEach(System.out::println);
    }

    /**
     * map映射
     * map映射的重要应用为:即类似SQL中的映射,获取对象中的某些属性(即数据库中的某些字段)
     */
    @Test
    public void test06() {

        //获取指定属性
        list.stream()
                .map(Person::getName)
                .forEach(System.out::println);

        //获取指定属性,并对属性进行操作
        list.stream()
                .map(person -> person.getName().toUpperCase())
                .forEach(System.out::println);
    }


    /**
     * flatMap映射
     */
    @Test
    public void test07() {

        //获取指定属性
        list.stream()
                .map(person -> person.getName().split(" "))
                .forEach(arr -> {
                    System.out.println(Arrays.toString(arr));
                });

//        我们的目的是把 List 中每个字符串元素以" "分割开,变成一个新的 List。
//        首先 map 方法分割每个字符串元素,但此时流的类型为 Stream<String[ ]>,
//        因为 split 方法返回的是 String[ ] 类型;所以我们需要使用 flatMap 方法,
//        先使用Arrays::stream将每个 String[ ] 元素变成一个 java.util.stream.Stream 流,
//        然后 flatMap 会将每一个流连接成为一个流,最终返回我们需要的 Stream
        list.stream()
                .map(person -> person.getName().split(" "))
                .flatMap(Arrays::stream)
                .forEach(System.out::println);
    }

    /**
     * 自然排序 sorted()
     * 自然排序(Comparable方式),按照字典顺序进行排序
     * reversed() 倒序 从大到小
     * 优先排序的元素放在后面
     */
    @Test
    public void test08() {
        //获取指定属性
        list.stream()
                .sorted(Comparator.comparing(Person::getAge).reversed())
                .sorted(Comparator.comparing(Person::getSalary))
                .forEach(System.out::println);
    }

    /**
     * allMatch-检查是否匹配所有元素
     * 返回结果:
     * - true 匹配到了所有的元素 注意:和noneMatch()的false 结果代表集合不同
     * - false 没有匹配到所有的元素 说明匹配到条件集合中的真子集
     */
    @Test
    public void test09() {
        //获取指定属性
        boolean b = list.stream()
                .allMatch(person -> person.getAge() > 4);
        System.out.println(b);
    }

    /**
     * anyMatch-检查是否至少匹配一个元素
     * 返回结果:
     * - true 匹配到了条件集合中的真子集元素,一个或者多个
     * - false 一个元素都没有匹配到,空集
     */
    @Test
    public void test10() {
        //获取指定属性
        boolean b = list.stream()
                .anyMatch(person -> person.getAge() > 60);
        System.out.println(b);
    }

    /**
     * noneMatch-检查是否所有元素都没有匹配到
     * 返回结果:
     * - true 所有元素都没有匹配到,空集
     * - false 不是所有的元素都没有匹配到 即匹配到了元素,有匹配到的元素即返回false,真子集
     */
    @Test
    public void test11() {
        //获取指定属性
        boolean b = list.stream()
                .noneMatch(person -> person.getAge() > 90);
        System.out.println(b);
    }


    /**
     * count-返回流中元素总个数
     */
    @Test
    public void test12() {
        long size = list.stream().count();
        System.out.println(size);
    }

    /**
     * min-返回流中的最小值
     * 注意 与当前的排序顺序有关系
     */
    @Test
    public void test13() {

        Person person = list.stream().max(Comparator.comparing(Person::getAge)).get();
        System.out.println(person);

        Person person1 = list.stream().min(Comparator.comparing(Person::getAge)).get();
        System.out.println(person1);
    }

    /**
     * reduce-将流中元素反复结合起来,得到一个值
     */
    @Test
    public void test15() {

        List<Integer> asList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        //利用reduce归约函数,可以指定归约规则,将集合中的元素数值进行求和操作等
        //以0为起始值,对集合中的各个值进行相加
        Integer sum = asList.stream().reduce(0, (x, y) -> x + y);
        //等价于
        Integer sum1 = asList.stream().reduce(0, Integer::sum);
        System.out.println(sum);

        //以1为起始值
        Integer sum2 = asList.stream().reduce(1, (x, y) -> x * y);
        System.out.println(sum2);

        //对象中的属性值 属性类型是基本类型
        Optional<Integer> reduce = list.stream().map(Person::getAge).reduce(Integer::sum);
        System.out.println("age = " + reduce.get());

        //对象中的属性值 属性类型是其他类型
        BigDecimal reduce1 = list.stream().map(Person::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
        System.out.println("salary= " + reduce1);

    }

    /**
     * collect-将流转换为其他形式
     */
    @Test
    public void test16() {

        List<String> names = list.stream().map(Person::getName).collect(Collectors.toList());
        System.out.println(names);
    }

    /**
     * Collectors类中的常用方法
     */
    /**
     * counting-统计数量
     */
    @Test
    public void test17() {

        Long size = list.stream().collect(Collectors.counting());
        System.out.println(size);
    }


    /**
     * averagingInt-求平均值并转换成Double类型
     */
    @Test
    public void test18() {

        Double averInt = list.stream()
                .collect(Collectors.averagingInt(Person::getAge));
        System.out.println(averInt);
        Double averDouble = list.stream()
                .collect(Collectors.averagingDouble(Person::getAge));
        System.out.println(averDouble);
    }

    /**
     * summingDouble-求和并转换成Double类型
     */
    @Test
    public void test19() {

        Double mapToDouble = list.stream().mapToDouble(Person::getAge).sum();
        Double summingDouble = list.stream()
                .collect(Collectors.summingDouble(Person::getAge));
        System.out.println(summingDouble);
        Integer summingInt = list.stream()
                .collect(Collectors.summingInt(Person::getAge));
        System.out.println(summingInt);

    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术闲聊DD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值