read().getName(),obj);
}
打印结果
[main]:7
[ForkJoinPool.commonPool-worker-2]:1
[ForkJoinPool.commonPool-worker-2]:4
[ForkJoinPool.commonPool-worker-9]:8
[ForkJoinPool.commonPool-worker-6]:3
[ForkJoinPool.commonPool-worker-13]:6
[ForkJoinPool.commonPool-worker-15]:5
[ForkJoinPool.commonPool-worker-4]:9
[ForkJoinPool.commonPool-worker-11]:2
[main]:1
这个默认创建系统设置的线程数(NUMBER_OF_PROCESSORS)
理解Collect
/**collect的使用案例
* @param integers
* @return
*/
public static List<Integer> collect(Integer... integers){
List<Integer> collect = Stream.of(integers).collect(Collectors.toList());
List<Integer> collect2 = Stream.of(integers).collect(LinkedList::new,LinkedList::add,LinkedList::addAll);
return collect;
}
理解flatMap
一般是处理一些降维的需求,例如List<List<Klass>> -- > List<Klass>
static class Klass {
private String name;
public Klass(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Klass{" +
"name='" + name + '\'' +
'}';
}
}
static class KlassGroup {
private List<Klass> group = new ArrayList<>();
public KlassGroup(Klass... klass) {
group.addAll(Arrays.asList(klass));
}
public List<Klass> getGroup() {
return group;
}
}
// 现在要做的一件事是如果有多个List<Klass>想合并成一个List<Klass>
/**
* 关于flatMap的使用
* @param klassLoist
* @return
*/
public static List<Klass> mergeKlass(List<List<Klass>> klassLoist){
return klassLoist.stream().flatMap(Collection::stream).collect(Collectors.toList());
}
函数式编程的局限性
尽管函数式编程在很多场景下提供了很多优势,但它也有一些局限性:
-
学习曲线:对于习惯了命令式编程范式的开发者来说,切换到函数式编程需要适应新的思维方式和编程习惯。函数式编程的概念和特性可能对初学者来说较为陌生,需要一定的学习和实践才能熟练掌握。
-
性能问题:虽然函数式编程提倡不可变数据和纯函数,但有时候为了实现函数式编程的特性,可能需要引入额外的对象拷贝或数据结构转换,导致一定的性能损失。对于一些性能敏感的场景,可能需要权衡是否使用函数式编程。
-
可读性问题:虽然函数式编程鼓励使用更简洁、声明式的代码,但对于复杂的业务逻辑,过度使用函数式编程可能会导致代码的可读性下降,增加理解的难度。
-
嵌套问题:函数式编程中的函数组合、嵌套等特性,可能导致代码的层级嵌套过深,降低代码的可读性和可维护性。
-
现有项目兼容性:对于现有的项目,特别是老旧项目,可能由于历史原因和架构设计,不太容易完全引入函数式编程的特性,可能需要进行较大的重构。
-
并发处理复杂性:函数式编程鼓励不可变数据和纯函数,这在并发处理时可以避免一些线程安全问题。但对于复杂的并发场景,函数式编程的特性可能会增加代码的复杂性,需要谨慎处理。
站在巨人的肩膀上
- 函数式编程思维(Functional Thinking)(书籍) - Neal Ford 这本书向读者介绍了函数式编程的思维方式和概念,它从函数式编程的基础开始,逐步深入,涵盖了函数式编程在 Java、java script、Scala 等编程语言中的应用。
- Java 8 in Action(书籍) - Raoul-Gabriel Urma, Mario Fusco, Alan Mycroft 这本书全面讲解了 Java 8 的新特性,包括函数式编程、Lambda 表达式、Stream API 等。它提供了大量实例和案例,帮助读者快速上手函数式编程在 Java 中的应用。
- Functional Programming Principles in Scala(在线课程) - Martin Odersky 这是由 Scala 语言的创始人 Martin Odersky 主讲的在线课程。课程涵盖函数式编程的基本概念和原则,并通过 Scala 语言进行实践。
- Functional Programming for the Object-Oriented Programmer(在线文章) - Brian Marick 这篇文章向面向对象编程开发者介绍函数式编程的概念和思维方式,帮助他们理解函数式编程并适应新的编程范式。
- Functional Programming Concepts in Python(在线教程) - Real Python 这个教程将 Python 中的函数式编程概念进行了详细介绍,涵盖了函数、Lambda 函数、高阶函数、Generator 等内容。