flatmap方法
flatMap
方法
flatMap
是 Java 8 中引入的 Stream API 方法。它用于将一个元素映射到多个元素的流中,并将其扁平化为单个流来处理。
语法:
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
其中:
T
是输入流的元素类型。R
是输出流的元素类型。mapper
是一个函数,它将输入流中的每个元素映射到一个流,该流包含零个或多个输出流的元素。
工作原理:
flatMap
方法接受一个映射函数,该函数将输入流中的每个元素转换为一个流。它将每个子流中的元素提取并将其添加到输出流中。
想象一下以下示例,它将一个字符串流扁平化为一个字符流:
Stream<String> words = Stream.of("Hello", "World");
Stream<Character> characters = words.flatMap(word -> word.chars().mapToObj(c -> (char) c));
flatMap
会将 words
流中的每个字符串映射到一个字符流。它将 Hello
映射到流 [H, e, l, l, o]
,并将 World
映射到流 [W, o, r, l, d]
, 从而创建一个包含所有字符的扁平化流。
与 map
方法的区别:
map
方法也用于将输入流中的元素映射到一个新的流。但是,map
方法将每个元素映射到一个新值,而 flatMap
方法将每个元素映射到一个包含多个值的流。
使用场景:
flatMap
方法可用于各种场景,包括:
- 扁平化嵌套流
- 分解集合
- 创建笛卡尔积
- 提取子字符串或子序列
示例:
1. 扁平化嵌套列表:
List<List<Integer>> nestedList = List.of(List.of(1, 2), List.of(3, 4, 5));
List<Integer> flattenedList = nestedList.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
2. 分解字符串:
String text = "Hello World";
Stream<Character> characters = text.chars().mapToObj(c -> (char) c);
3. 创建笛卡尔积:
List<String> colors = List.of("Red", "Green", "Blue");
List<String> shapes = List.of("Circle", "Square", "Triangle");
Set<String> combinations = colors.stream()
.flatMap(color -> shapes.stream()
.map(shape -> color + " " + shape))
.collect(Collectors.toSet());
@SuperBuilder注解
@SuperBuilder
注解
@SuperBuilder
是 Lombok 提供的注解,它用于简化 Java 类的构建器模式。它允许你使用一个简洁的语法来创建带有可选参数和默认值的构建器。
语法:
@SuperBuilder
public class Person {
private String name;
private int age;
private Address address;
}
工作原理:
当你在类上使用 @SuperBuilder
注解时,Lombok 会为你生成一个名为 builder()
的静态方法。该方法返回一个构建器对象,允许你设置类的属性。
Person person = Person.builder()
.name("John Doe")
.age(30)
.address(new Address("123 Main Street", "Anytown", "CA", "12345"))
.build();
主要特性:
- **可选参数:**你可以选择设置哪些属性,其他属性将使用默认值或
null
。 - **默认值:**你可以为属性指定默认值。如果未在构建器中显式设置属性,则将使用默认值。
- **链式调用:**你可以链式调用构建器方法以设置多个属性。
- **不可变性:**构建的不可变对象。一旦调用
build()
方法,就不能再修改对象。
优点:
使用 @SuperBuilder
注解可以带来以下好处:
- **代码简洁:**它消除了编写冗长的构建器代码的需要。
- **可读性:**使用链式调用使构建过程更易于阅读和理解。
- **灵活性:**它允许你选择要设置的属性,并使用默认值来填补空白。
- **可定制:**你可以通过提供自定义的
@Builder
注解来定制构建器行为。
与其他构建器模式的比较:
与传统构建器模式相比,@SuperBuilder
注解提供了更简洁和灵活的方式来创建构建器。它消除了创建和维护单独的构建器类以及编写冗长的构建器代码的需要。
注意:
@SuperBuilder
注解需要 Lombok 库才能使用。在使用它之前,确保你的项目中已经集成了 Lombok。
注意@SuperBuilder
通常要和@NoArgsConstruct
以及@Data
注解一起使用,尤其是在结合Mybatis
进行查表操作时。由于@SuperBuilder
会导致类的无参构造器失效,因此Mybatis
在返回结果并进行封装时,会由于找不到无参构造器而抛出异常。