java8流处理,不生产博客,做个好博客的搬运工

这位大佬写的不错,每次不会都会去看看https://www.cnblogs.com/shenlanzhizun/p/6027042.html

另外补充一些Java8骚操作

BigDecimal求和

博客中位置:3.2 归约:reduce(其实已经有了int类型的求和,我写个这个类型的吧)

List<BigDecimal> bigDecimalList = new ArrayList<>();
bigDecimalList.add(BigDecimal.valueOf(0.05));
bigDecimalList.add(BigDecimal.valueOf(0.05));
System.out.println(bigDecimalList.stream().reduce(BigDecimal.ZERO,BigDecimal::add));
结果:0.10

另外提一点,

System.out.println(new BigDecimal(0.05));
结果:0.05000000000000000277555756156289135105907917022705078125

这个写法,是直接传入了double类型,输出的是丢失精度的结果,并不是BigDecimal会丢失精度,是double(具体百度)

所以尽量用 BigDecimal.valueOf()

将list映射为map

博客中位置:3.3 收集:toMap文中提到过,但是没有例子,实战中又用的到

借他list一用

//将学生id作为键,学生名称为值
Map<Long, String> collect = students.stream().collect(Collectors.toMap(Student::getId, Student::getName, (k1, k2) -> k1));
//将学生id作为键,学生对象为值
Map<Long, Student> studentMap = students.stream().collect(Collectors.toMap(Student::getId, student -> student, (k1, k2) -> k1));
//根据年级分组,封装成map
Map<Integer, List<Student>> map=students.stream().collect(Collectors.groupingBy(Student::getGrade);

排序

博客中位置:2.1 过滤:其中提到排序sorted(列子有排序字段类型是int)

//String类型 按照(姓名)自然顺序排序
students = students.stream().sorted((s1,s2)->s1.getName().compareTo(s2.getName())).collect(Collectors.toList());
//或者只排序姓名
List<String> stringList = students.stream().map(Student::getName).collect(Collectors.toList());
stringList =stringList.stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList());
//按照时间排序(倒叙) 假设学生对象有创建时间这个字段
students = students.stream().sorted(Comparator.comparing(Student::getCreateTime).reversed()).collect(Collectors.toList());

并行流

public void pullSupplier() {
List<String> students = new ArrayList<>();
ForkJoinPool myPool = new ForkJoinPool(30);
myPool.submit(() -> students.parallelStream().forEach(
student -> {
//设置九千万学生国籍(具体的逻辑)
student.setGJ("中国");
}));
}

欢迎补充批评,另外工作中另外遇到我会补充更新

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
*
*/
public class FXInterface {
static List<Student> students = new ArrayList<>();

static {
students.add(Student.builder().grade(1).mark(10).name("小明").build());
students.add(Student.builder().grade(1).mark(20).name("小明").build());
students.add(Student.builder().grade(2).mark(20).name("张三").build());
students.add(Student.builder().grade(2).mark(30).name("张三").build());
students.add(Student.builder().grade(2).mark(40).name("张三").build());
}
public static void main(String[] args) {
//每个班级的平均分
Map<Integer, Double> collect = students.stream().collect(Collectors.groupingBy(Student::getGrade, Collectors.averagingInt(Student::getMark)));
//每个班级的总分
Map<Integer, Integer> collect1 = students.stream().collect(Collectors.groupingBy(Student::getGrade, Collectors.summingInt(Student::getMark)));
//自定义条件分两组,分数大于等于25的分一组,小于25的分一组
Map<Boolean, List<Student>> collect2 = students.stream().collect(Collectors.groupingBy(s->s.getMark()>25));
System.out.println(collect);
System.out.println(collect1);
System.out.println(collect2);
}
}

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private String name;
    //班级
    private int grade;
    //分数
    private int mark;
}

分组之后求每组平均数

 

 

posted @ 2019-07-19 20:29  createcoc  阅读(323)  评论(0编辑  收藏  举报