java8 stream的使用笔记

简介

记录stream常用的相关操作

//测试类
public class Test {
    /**
     * 人名
     */
    private String name;

    /**
     * 随机值
     */
    private String code;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 金额
     */
    private BigDecimal money;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public BigDecimal getMoney() {
        return money;
    }

    public void setMoney(BigDecimal money) {
        this.money = money;
    }
}

测试数据
		List<Test> testList = new ArrayList<>();
		testList.add(new Test("风停", "123", 22, new BigDecimal(12)));
        testList.add(new Test("风停1", "1", 56, new BigDecimal(12)));
        testList.add(new Test("风停2", "444", 23, new BigDecimal(12)));
        testList.add(new Test("风停2", "444", 23, new BigDecimal(12)));
        testList.add(new Test("风停", "666", 68, new BigDecimal(13)));
        testList.add(new Test("风停3", "666", 68, new BigDecimal(13)));

toList()

   List<Integer> collect2 = 	testList.stream().map(Test::getAge).collect(Collectors.toList());
        System.out.println(collect2);
打印结果:
	[22, 56, 23, 23, 68, 68]

map() 从一个集合中抽取某一个属性

	list .stream().map(Test::getName).forEach(e-> System.out.println(e));
打印结果:
	["风停","风停1","风停2","风停"]

forEach()循环的使用

	testList.stream().forEach(e-> System.out.println(e));
        
打印结果:
	Test{name='风停', code='123', age=22, money=12}
	Test{name='风停1', code='1', age=22, money=12}
	Test{name='风停2', code='444', age=23, money=12}
	Test{name='风停', code='666', age=22, money=12}

sorted()排序的使用

	//根据getAge正序
	testList.stream().sorted(Comparator.comparing(Test::getAge)).forEach(e-> System.out.println(e));
	//根据getAge倒叙(正序以后在倒叙)
	testList.stream().sorted(Comparator.comparing(Test::getAge).reversed()).forEach(e-> System.out.println(e));
	//根据getAge倒叙(直接倒叙) 建议使用此方法
	testList.stream().sorted(Comparator.comparing(Test::getAge,Comparator.reverseOrder())).forEach(e-> System.out.println(e));
	//多字段排序
	testList.stream().sorted(Comparator.comparing(Test::getAge,Comparator.reverseOrder()).thenComparing(Test::getMoney,Comparator.reverseOrder())).forEach(e-> System.out.println(e));

filter() 方法过滤

	testList.stream().filter(test -> test.getAge() > 50).forEach(test -> System.out.println(test ));
打印结果:
	Test{name='风停1', code='1', age=56, money=12}
	Test{name='风停', code='666', age=68, money=13}

limit() 获取条数

	testList.stream().limit(2).forEach(test -> System.out.println(test));
打印结果:
	Test{name='风停', code='123', age=22, money=12}
	Test{name='风停1', code='1', age=56, money=12}

skip() 截取前面2条

	testList.stream().skip(2).forEach(test -> System.out.println(test));
打印结果:
	Test{name='风停2', code='444', age=23, money=12}
	Test{name='风停', code='666', age=68, money=13}

distinct() 去重(必须重写hashCode()和equals()方法) 指定字段去重

	testList.stream().distinct().forEach(test -> System.out.println(test));
	//指定字段去重
	List<Test> testList =testList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.getName()+f.getAge()))), ArrayList::new)).forEach(test -> System.out.println(test));

count ,avg,max,min,sum的使用

	int sum = testList.stream().mapToInt(e -> e.getAge()).sum();
	System.out.println("年龄之和:" + sum);
	IntSummaryStatistics intSummaryStatistics = testList.stream().mapToInt(e -> e.getAge()).summaryStatistics();
	System.out.println("总共人数:" + intSummaryStatistics.getCount());
	System.out.println("平均年龄:" + intSummaryStatistics.getAverage());
	System.out.println("最大年龄:" + intSummaryStatistics.getMax());
	System.out.println("最小年龄:" + intSummaryStatistics.getMin());
	System.out.println("年龄之和:" + intSummaryStatistics.getSum());
打印结果:
	年龄之和:260
	总共人数:6
	平均年龄:43.333333333333336
	最大年龄:68
	最小年龄:22
	年龄之和:260

flatMap() 多个list合并为一个list

   		List<Test> testList = new ArrayList<>();
        testList.add(new Test("风停", "123", 22, new BigDecimal(12)));
        testList.add(new Test("风停1", "1", 56, new BigDecimal(12)));
        testList.add(new Test("风停2", "444", 23, new BigDecimal(12)));
        testList.add(new Test("风停2", "444", 23, new BigDecimal(12)));
        testList.add(new Test("风停", "666", 68, new BigDecimal(13)));
        testList.add(new Test("风停3", "666", 68, new BigDecimal(13)));
        List<Test> testList1 = new ArrayList<>();
        testList1.add(new Test("风停", "123", 22, new BigDecimal(12)));
        testList1.add(new Test("风停1", "1", 56, new BigDecimal(12)));
        testList1.add(new Test("风停2", "444", 23, new BigDecimal(12)));
        testList1.add(new Test("风停2", "444", 23, new BigDecimal(12)));
        testList1.add(new Test("风停", "666", 68, new BigDecimal(13)));
        testList1.add(new Test("风停3", "666", 68, new BigDecimal(13)));
        List<List<Test>> aaa = new ArrayList<>();
        aaa.add(testList);
        aaa.add(testList1);
        aaa.stream().flatMap(e->e.stream()).forEach(test -> System.out.println(test));
打印结果:
Test{name='风停', code='123', age=22, money=12}
Test{name='风停1', code='1', age=56, money=12}
Test{name='风停2', code='444', age=23, money=12}
Test{name='风停2', code='444', age=23, money=12}
Test{name='风停', code='666', age=68, money=13}
Test{name='风停3', code='666', age=68, money=13}
Test{name='风停', code='123', age=22, money=12}
Test{name='风停1', code='1', age=56, money=12}
Test{name='风停2', code='444', age=23, money=12}
Test{name='风停2', code='444', age=23, money=12}
Test{name='风停', code='666', age=68, money=13}
Test{name='风停3', code='666', age=68, money=13}
Test{name='风停', code='123', age=22, money=12}
Test{name='风停1', code='1', age=56, money=12}
Test{name='风停2', code='444', age=23, money=12}
Test{name='风停2', code='444', age=23, money=12}
Test{name='风停', code='666', age=68, money=13}
Test{name='风停3', code='666', age=68, money=13}

findFirst() 获取第一个元素

   Test test = testList.stream().findFirst().get();
   System.out.println(test);
打印结果:
	Test{name='风停', code='123', age=22, money=12}

collect() list转字符串

  		 List<String> list = new ArrayList<>();
        list.add("123");
        list.add("456");
        list.add("789");
        String collect = list.stream().collect(Collectors.joining("-"));
        System.out.println(collect);
        String collect1 = list.stream().collect(Collectors.joining("-","(",")"));
        System.out.println(collect1);
打印结果:
	123-456-789
	(123-456-789)

stream 双重for循环

   		List<Test> testList = new ArrayList<>();
        testList.add(new Test("风停", "123", 222, new BigDecimal(12)));
        testList.add(new Test("风停1", "1", 562, new BigDecimal(12)));
        testList.add(new Test("风停2", "444", 232, new BigDecimal(12)));
        testList.add(new Test("风停2", "444", 232, new BigDecimal(12)));
        testList.add(new Test("风停", "666", 682, new BigDecimal(13)));
        testList.add(new Test("风停3", "666", 682, new BigDecimal(13)));
        List<Test> testList1 = new ArrayList<>();
        testList1.add(new Test("风停", "123", 22, new BigDecimal(12)));
        testList1.add(new Test("风停1", "1", 56, new BigDecimal(12)));
        testList.stream().forEach(e1 -> testList1.stream().anyMatch(e2 -> {
            if(e1.getName().equals(e2.getName())){
                e1.setAge(88);
            }
            return false;
        }));
        System.out.println(testList);
打印结果:
	[Test{name='风停', code='123', age=88, money=12}, Test{name='风停1', code='1', age=88, money=12}, Test{name='风停2', code='444', age=232, money=12}, Test{name='风停2', code='444', age=232, money=12}, Test{name='风停', code='666', age=88, money=13}, Test{name='风停3', code='666', age=682, money=13}]

根据某一字段分组

   List<Test> driverMoneyEntry = driverExpenditureService.getDriverMoneyEntry();
            if (driverMoneyEntry.size() > 0) {
                Map<Long, List<Test>> listMap = driverMoneyEntry.stream().collect(Collectors.groupingBy(Test::getName));
                for (Map.Entry<Long, List<Test>> longListEntry : listMap.entrySet()) {
                    List<Test> expenditureList = longListEntry.getValue();
                    //获取金额
                    String money = expenditureList.stream().map(e -> new BigDecimal(e.getMoney())).reduce(BigDecimal.ZERO, BigDecimal::add).toString();
                }
            }

anyMatch() allMatch() noneMatch()

	//anyMatch 任意匹配就返回true 反之false
	//allMatch 全部匹配就返回true 反之false
	//noneMatch 完全不匹配就返回true 反之false
   boolean isAdmin = testList.stream().anyMatch(r -> "风停".equalsIgnoreCase(r.getName()));
        boolean isAdmin1 = testList.stream().allMatch(r -> "风停".equalsIgnoreCase(r.getName()));
        boolean isAdmin2 = testList.stream().noneMatch(r -> "风停".equalsIgnoreCase(r.getName()));
        System.out.println(isAdmin);
        System.out.println(isAdmin1);
        System.out.println(isAdmin2);
打印结果:
true
false
false

将实体的两个字段封装到map中

   Map<String, String> collect = testList.stream().collect(Collectors.toMap(Test::getName, Test::getCode));
   //有重复的用下面的
   Map<String, String> collect = testList.stream().collect(Collectors.toMap(Test::getName, Test::getCode,(item1,item2) ->item1));
        System.out.println(collect);
打印结果:
{风停3=666, 风停2=444, 风停1=1, 风停=123}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值