Spring学习笔记

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在返回结果并进行封装时,会由于找不到无参构造器而抛出异常。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你这个代码我看不懂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值