JAVA8 中的Stream的flatMap 的使用

   刚开始学习flatMap(扁平化处理)的时候,是有点懵的,对其的应用的场景是模糊的。真的遇上了,就真的明白了怎么样了。学习的时候,可能只记得其作用,这样也行,后面用的时候,再进一步学习,有应用的场景,就容易记住。有时间再加一些变化,多折腾下,学会如何使用及其适用的场景

1,flatMap的使用:

1,数组Array的flatMap:

String[] oneArr = new String[]{"10111011001", "10119910001"};
String[] twoArr = new String[]{"11111017501", "10119910001"};
System.out.println(Arrays.toString(mergeArr(oneArr, twoArr)));
System.out.println(mergeArrToList(oneArr, twoArr).toString());


@SafeVarargs
private static String[] mergeArr(String[]... arrs) {
    return Arrays.stream(arrs).filter(Objects::nonNull).flatMap(Arrays::stream).distinct()
            .toArray(String[]::new);
}



@SafeVarargs
private static List<String>  mergeArrToList(String[]... arrs) {
    return Arrays.stream(arrs).filter(Objects::nonNull).flatMap(Arrays::stream).distinct()
            .collect(Collectors.toList());
}

2,集合List的flatMap

List<String> oneList = Arrays.asList("10111011001", "10119910001");
List<String> twoList = Arrays.asList("11111017501", "10119910001");
System.out.println(mergeList(oneList, twoList).toString());
System.out.println(Arrays.toString(mergeListToArry(oneList, twoList)));

@SafeVarargs
private static List<String>  mergeList(List<String>... arrs) {
    return Arrays.stream(arrs).filter(Objects::nonNull).flatMap(Collection::stream).distinct()
            .collect(Collectors.toList());
}

@SafeVarargs
private static String[] mergeListToArry(List<String>... arrs) {
    return Arrays.stream(arrs).filter(Objects::nonNull).flatMap(Collection::stream).distinct()
            .toArray(String[]::new);
}

3,对象的集合的flatMap

场景:比如获取班级里面,学生已经选修的课程(多门选修课,每个学生可以选修三门)

辅助类Student:

public class Student {
    private long id;
    private String name;
    private String course;

    public Student(long id, String name, String course) {
        this.id = id;
        this.name = name;
        this.course = course;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }
}

处理:

// 先通过map获取到课程的信息,分离出选择的课程,或是用flatMap也先汇聚,再进行分离:

List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1L,"张三", "网页设计,围棋,日语"));
studentList.add(new Student(2L,"李四", "网页设计,营养学,篮球"));
studentList.add(new Student(3L,"王五", "数学建模,象棋,法语"));
 studentList.add(JSON.parseObject("{\"id\":4,\"name\":\"赵六\",\"course\":\"体能,画画,瑜伽\"}", Student.class));
       
private static List<String> mergeSelectCourseMap(List<Student> studentList) {
    return ListUtils.emptyIfNull(studentList).stream().map(e -> e.getCourse().split(",")).flatMap(Arrays::stream).distinct()
            .collect(Collectors.toList());

}


private static List<String> mergeSelectCourseFlatMap(List<Student> studentList) {
    return ListUtils.emptyIfNull(studentList).stream().map(Student::getCourse).flatMap(e -> Arrays.stream(e.split(","))).distinct()
            .collect(Collectors.toList());

}

总结:

         flatMap还是比较好用的,也相对简单些,遇到要用场景,理解起来就简单多了。注意数据类型是数组还是集合就知道怎么用了。

(PS: 在声明具有模糊类型(比如:泛型)的可变参数的构造函数或方法时,Java编译器会报unchecked警告。鉴于这些情况,如果程序员断定声明的构造函数和方法的主体不会对其varargs参数执行潜在的不安全的操作,可使用@SafeVarargs进行标记,这样的话,Java编译器就不会报unchecked警告。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天狼1222

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

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

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

打赏作者

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

抵扣说明:

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

余额充值