Java 函数式编程

有且仅有一个未实现的非静态方法的接口叫做”函数式接口”

interface IFactory<t> {
    T create();
}
</t>
  • Arrays.stream(arraysName)
  • Collection.stream()(即所有 Collection 的实现类:list.stream()、set.stream())
  • Stream.of(将一个一个元素放入流中,可以放入任意类型对象)
Stream.of(arrays[1], 2, "string")
  • Stream.iterate()(流迭代器)
//&#x521D;&#x59CB;&#x503C;&#x4E3A; 0&#xFF0C;&#x6267;&#x884C; +1 &#x64CD;&#x4F5C;
Stream.iterate(0, n -> n + 1).limit(10)
  • Stream.generate()(构造流)
//&#x6D41;&#x4E2D;&#x6784;&#x9020; 10 &#x4E2A;&#x968F;&#x673A;&#x6570;
Stream.generate(() -> Math.random()).limit(10)
  • 中间操作符
    filter:元素过滤
    map:从一种对象映射成另一种对象
List<userdto> userDTO = userList.stream()
    .map(user -> UserDTO.builder()
        .name(user.getName())
        .mobile(user.getMobile())
        .build()
    )
    .collect(Collectors.toList());
</userdto>

peek:对元素的属性进行操作,常用于debug展示流过程输出

.peek(user -> log.debug("user {}", user))

findAny:在 parallelStream() 中使用,寻找满足条件的任一元素
findFirst:寻找满足条件的第一个元素

  • 终端操作符(后面不能再跟其他函数)
    forEach:循环操作
    forEachOrdered:在 parallelStream() 中使用该函数控制元素操作顺序
    anyMatch:任一匹配上就返回 true
    noneMatch:没有匹配上就返回 true
    allMatch:所有元素匹配上才返回 true
    collect:将流元素收集到一个集合中,Collectors 配合使用
Map<long, user> userMap = userList.stream()
    .collect(Collectors.toMap(User::getId, user -> user));
</long,>
  • 具有统计意义的终端操作符
    count:统计数量
    min
    *max

核心作用:进行流处理时,比如 filter 过滤之后可能没有符合条件的元素,流已经为 NULL,这种情况下就可以使用 Optional 流作为返回对象,保证后续流操作能正常执行,不报错。
常用方法
isPresent():如果不为空返回 true
isEmpty():如果为空返回 true
get():如果 Optional 有值则将其返回,否则抛异常
以下三个方法可以用来 Optional 转 List,如:

.ifPresent(Collections.toList())

orElse():当 Optional 为空,可以给定一个默认值,
ifPresent():当流不为空时,执行该函数里的代码块,如
ifPresentOrElse(a -> {a++}, () -> {log.debug(“空”)}):当流不为空时,执行前面的代码块,为空时执行后面的代码块

toSet()
toMap()

Map<long, user> userMap = userList.stream()
    .collect(Collectors.toMap(User::getId, user -> user));
</long,>

toList()
toCollection()

averagingDouble():求平均值
summingInt():求和
summarizingDouble():DoubleSummaryStatistics 配合使用,可对其进行各种聚合操作(getAverage()、getCount()、getMax()、getMin()、getSum())

double avg = userList.stream().collect(Collectors.averagingDouble(User::getAge));
DoubleSummaryStatistics stat = userList.stream().collect(Collectors.summarizingDouble(User::getAge));
double avg = stat.getAverage();
Long count = stat.getCount();

groupingBy(groupCondition, mapValue):分组

//&#x6309;&#x5E74;&#x9F84;&#x5206;&#x7EC4;
Map<integer, list<user>> groupUser = userList.stream().collect(Collectors.groupingBy(user -> (int)Math.floor(user.getAge() / 10)));
//&#x7EDF;&#x8BA1;&#x4E0D;&#x540C;&#x5E74;&#x9F84;&#x9636;&#x6BB5;&#x7684;&#x5404;&#x805A;&#x5408;&#x503C;
Map<integer, doublesummarystatistics> groupUser = userList.stream().collect(Collectors.groupingBy(user -> (int)Math.floor(user.getAge() / 10),
summarizingDouble(User::getAge)));
//&#x5206;&#x7EC4;&#x6620;&#x5C04;
Map<integer, list<userdto>> result = userList.stream().collect(
    Collectors.groupingBy(
        user -> (int)Math.floor(user.getAge() / 10),
        Collectors.mapping(
            user -> new UserDto(
                user.getId(), user.getUserName()
            ),
            Collectors.toList()
        )
    )
);
</integer,></integer,></integer,>

mapping(value, 下游链或者Collectors.toList()等集合)

List<string> strings = List.of("bb", "ddd", "cc", "a");
Map<integer, treeset<string>> result = strings.stream().collect(groupingBy(
        String::length,
        mapping(
            String::toUpperCase,
            filtering(
                s -> s.length() > 1,
                toCollection(TreeSet::new)
            )
        )
));
</integer,></string>

sorted()

//&#x9ED8;&#x8BA4;&#x5BF9;&#x7B80;&#x5355;&#x7C7B;&#x578B;&#x5347;&#x5E8F;&#x6392;&#x5217;
List<string> sort = list.stream().sorted().collect(toList());
//&#x7B80;&#x5355;&#x7C7B;&#x578B;&#x81EA;&#x5B9A;&#x4E49;&#x6392;&#x5217;
List<string> sort = list.stream().sorted(
    (a,b) -> a.compareTo(b))
    .collect(toList());
//&#x5BF9;&#x7B80;&#x5355;&#x7C7B;&#x578B;&#x964D;&#x5E8F;&#x6392;&#x5217;
List<string> sort = list.stream().sorted(
    Comparator.reverseOrder())
    .collect(toList());
//&#x53D6;&#x5BF9;&#x8C61;&#x4E2D;&#x67D0;&#x4E2A;&#x5C5E;&#x6027;&#x81EA;&#x5B9A;&#x4E49;&#x6392;&#x5E8F;
List<string> sort = userList.stream().sorted(
    Comparator.comparing(
        user -> user.getId(),
        (a, b) -> a.compareTo(b)
    )
)
.collect(toList());

List<string> sort = userList.stream().sorted(
    (a, b) -> a.getUserName().compareTo(b.getUserName())
)
.collect(toList());
</string></string></string></string></string>

父子对象常见的集合属性(如:List 的 Student 对象下面存在 List)

List<course> courseList = studentList.stream().flatMap(
    student -> student.getCourseList().stream())
.collect(toList());
</course>

过滤Optional<>流中的空值对象,剩下的都是有值的Opitonal<>对象

.flatMap(Optional::stream)

Original: https://www.cnblogs.com/pandacode/p/15679438.html
Author: 这个杀手冷死了
Title: Java 函数式编程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575909/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球