Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 8 函数式编程Java 8 函数式编程

Java 8 函数式编程Java 8 函数式编程

作者头像
林万程
发布于 2018-09-29 08:28:06
发布于 2018-09-29 08:28:06
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

Java 8 函数式编程

java.util.function.* @FunctionalInterface 都是函数接口,没有成员(状态)

高阶函数:参数或返回值为函数

方法引用:类名::方法名 可以 类名::new、String[]::new

流操作

Stream.of("-1", "0", "1") // 生成 .map(函数) // 映射 .filter(返回布尔值函数) // 过滤器(重构:找for中if) .flatMap(函数) // 平面映射:多个流合并 .min(Comparator.comparing(x -> x.getLength())) .reduce(0, (a, b) -> a+b); // 缩小 a一开始是第一个参数0,b是不断传入的流元素, 这个式子的功能是求和, 可以用Integer的sum函数替代第二个式子, 写成.reduce(0, Integer::sum); .forEach // 遍历,可以不纯 .peek(e -> System.out.println("Mapped value: " + e)) 可以记录中间值用于调试,不会像forEach那样使得流不可用 .collect(Collector) interface Collector<T, A, R> // 输入类型,累加器,返回类型 接口方法: Supplier<A> supplier(); // 供应器:创建容器 BiConsumer<A, T> accumulator(); // 累加器:类似reduce的第二参数(函数式) BinaryOperator<A> combiner(); // 组合器:合并容器 Function<A, R> finisher(); // 完工者:转换为想要的结果类型 Set<Characteristics> characteristics(); // 特征:返回不可变集合 .collect(Collectors.toList()); // 采集:生成列表 .collect(Collectors.toCollection(TreeSet::new)) .collect(Collectors.joining(", ", "[", "]")); .collect(Collectors.summingInt(Integer::valueOf)) .collect(Collectors.partitioningBy(x->x.length()>1)); // Map<Boolean, List<T>> .collect(Collectors.groupingBy(String::length)) // Map<R, List<T>> .collect(Collectors.groupingBy(String::length,Collectors.counting())) 下游收集器 = Collectors.mapping(String::length, Collectors.toList()); .collect(Collectors.groupingBy(String::length,下游收集器)); .collect(Collectors.maxBy(Comparator 比较规则))

.parallel() // BaseStream 并行流 集合.parallelStream() 影响性能因素:1.数据大小、2.结构、3.装箱、4.核心数、5单元处理开销 分解性能: 好:ArrayList、数组、IntStream.range 中:HashSet、TreeSet 差:LinkedList、Streams.iterate、BefferedReader.lines 无状态:filter、flatMap(速度快) 有状态:sorted、distinct、limit

.mapToInt() // 映射并转换为基本类型,其他类似 基本类型速度快、占用小

IntStream.of(1, 2, 3).summaryStatistics() .getCount() .getSum() .getMin() .getAverage() .getMax()

// 供应者:只有get方法的函数 public interface Supplier<T> { T get(); }

// 判定:返回布尔值的函数 Predicate<T> { boolean test(T t); and; 否定 negate; or; isEqual }

// 函数 Function<T, R> {R apply(T t); 组合compose; andThen; 同一 identity}

重载时 javac 会选最具体的

Optional.of("a") .isPresent() .get() .orElse("b") .orElseGet(只有get方法的函数)

TDD 测试驱动开发 BDD 行为驱动开发,TDD 的一个变种 DSL 领域专用语言

public class 类名 {{ }} // 匿名构造函数 public class 类名 { public 类名() {} }

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
并行运行基于集合流的质数计数程序
public long countPrimes(int upTo) {
    return IntStream.range(1, upTo)
            .parallel()
            .filter(this::isPrime)
            .count();
}
private boolean isPrime(int number) {
    return IntStream.range(2, number)
            .allMatch(x -> (number % x) != 0);
}

使用 Map 的 computeIfAbsent 方法高效计算斐波那契数列。
这里的“高效”是指避免将那些较小的序列重复计算多次。
public class Fibonacci {

    private final Map<Integer,Long> cache;

    public Fibonacci() {
        cache = new HashMap<>();
        cache.put(0, 0L);
        cache.put(1, 1L);
    }

    public long fibonacci(int x) {
        return cache.computeIfAbsent(x, n -> fibonacci(n-1) + fibonacci(n-2));
    }

}

Map.merge(key,value,BiFunction)

BufferedReader::lines
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.09.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java8 Stream,常用方法大合集
一、概述 二、分类 三、具体用法 1.流的常用创建方法 2.流的中间操作 3.流的终止操作
鱼找水需要时间
2023/02/16
4680
Java8 Stream,常用方法大合集
Java 编程问题:九、函数式编程——深入研究
本章包括 22 个涉及 Java 函数式编程的问题。这里,我们将重点讨论在流中遇到的涉及经典操作的几个问题(例如,filter和map),并讨论无限流、空安全流和缺省方法。这个问题的综合列表将涵盖分组、分区和收集器,包括 JDK12teeing()收集器和编写自定义收集器。此外,还将讨论takeWhile()、dropWhile()、组合函数、谓词和比较器、Lambda 测试和调试以及其他一些很酷的话题。
ApacheCN_飞龙
2022/07/11
1.9K0
java8 最大的特性:Lambda表达式,即函数式编程
java8最大的特性就是引入Lambda表达式,即函数式编程,可以将行为进行传递。总结就是:使用不可变值与函数,函数对不可变值进行处理,映射成另一个值。
二哥聊运营工具
2021/12/17
5530
java8 最大的特性:Lambda表达式,即函数式编程
深度探秘 Java 8 函数式编程(下)
函数编程的一大益处,是用更精练的代码表达常用数据处理模式。函数接口能够轻易地实现模板方法模式,只要将不确定的业务逻辑抽象成函数接口,然后传入不同的lambda表达式即可。博文“精练代码:一次Java函数式编程的重构之旅” 展示了如何使用函数式编程来重构常见代码,萃取更多可复用的代码模式。
芋道源码
2018/12/24
1K0
【如何亮剑】用例子来学习Stream
看似没什么问题,因为我们写过太多类似的**”样板”代码**,尽管智能的IDE通过code template功能让这一枯燥过程变得简化,但终究不能改变冗余代码的本质。
你呀不牛
2021/12/02
8950
【如何亮剑】用例子来学习Stream
Java官方笔记14流
The Stream API is probably the second most important feature added to Java SE 8, after the lambda expressions. In a nutshell, the Stream API is about providing an implementation of the well known map-filter-reduce algorithm to the JDK.
dongfanger
2023/07/20
2310
java函数式编程Function(java函数式编程实战)
JAVA版本最新的目前已经发布到11了,但目前市面上大多数公司依然在使用Java7之前版本的语法,然而这些编程模式已经渐渐的跟不上新时代的技术了。比如时下潮流前沿spring framework5中的响应式编程就是使用到了函数式编程的风格。
全栈程序员站长
2022/08/02
2.3K0
java函数式编程Function(java函数式编程实战)
Java Stream流详解——串行版
Stream流是java8引入的特性,极大的方便了我们对于程序内数据的操作,提高了性能。通过函数式编程解决复杂问题。
Mr.Shelby
2024/12/27
1510
Java Stream流详解——串行版
[四] java8 函数式编程 收集器浅析 收集器Collector常用方法 运行原理 内部实现
收集器是由四个函数约定构成,它们一起工作,将条目汇集到一个可变的结果容器中,并可选择性地对结果执行最终转换。
noteless
2018/09/11
1.2K0
[四] java8 函数式编程 收集器浅析 收集器Collector常用方法 运行原理 内部实现
【Java基础-1】 Java8新特性Stream详解
Java8的API中添加了一个新的特性: 流,即stream。stream是将数组或者集合的元素视为流,流在管道中流动过程中,对数据进行筛选、排序和其他操作。
云深i不知处
2020/09/16
1.2K0
讲透JAVA Stream的collect用法与原理,远比你想象的更强大
在我前面的文章《吃透JAVA的Stream流操作,多年实践总结》中呢,对Stream的整体情况进行了细致全面的讲解,也大概介绍了下结果收集器Collectors的常见用法 —— 但远不是全部。
是Vzn呀
2022/08/05
4.2K1
讲透JAVA Stream的collect用法与原理,远比你想象的更强大
Java 函数式编程
findAny:在 parallelStream() 中使用,寻找满足条件的任一元素 findFirst:寻找满足条件的第一个元素
玖柒的小窝
2021/12/14
5280
深度探秘 Java 8 函数式编程(上)
怎样在一行代码里同时计算一个列表的和、最大值、最小值、平均值、元素个数、奇偶分组、指数、排序呢?
芋道源码
2018/12/24
8120
java8-Stream Api流详解
流的定义:通俗地说,不用再写循环,判断等细节实现的代码,直接以声明式方式编写你的意图。节省了大量的中间容器去存储临时的中间变量。那流怎么来的呢,有这么一个定义:从支持数据处理操作的源生成的元素序列,流处理的是计算,集合处理的是存储
简熵
2023/03/06
7270
java8-Stream Api流详解
强大的 Stream 函数式编程
Java8(又称为 Jdk1.8)是 Java 语言开发的一个主要版本。Oracle 公司于 2014 年 3 月 18 日发布 Java8,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的 Stream API 等。Java8 API 添加了一个新的抽象称为流 Stream,可以让你以一种声明的方式处理数据。Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。
BUG弄潮儿
2021/07/22
2.9K0
Java开发之Java8 新特性--流式数据处理学习
在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现。比如我们希望对一个包含整数的集合中筛选出所有的偶数,并将其封装成为一个新的List返回,那么在java8之前,我们需要通过如下代码实现:
用户1289394
2018/12/06
1.9K0
JDK 8 新特性之函数式编程 → Stream API
  现在的我没那激情了,只喜欢坐在角落里,默默的听着他们唱,就连旁边的妹子都劝我说:大哥别摸了,唱首歌吧
青石路
2020/09/01
5380
JDK 8 新特性之函数式编程 → Stream API
Java 8 Stream 从入门到进阶——像SQL一样玩转集合
所以有没有这样一种方式可以让我们不再使用一遍又一遍的循环去处理集合,而是能够便捷地操作集合?
翊君
2022/03/08
6900
Java 8 Stream 从入门到进阶——像SQL一样玩转集合
java8 函数式编程一
为什么要先从函数接口说起呢?因为我觉得这是 java8 函数式编程的入口呀!每个函数接口都带有 @FunctionalInterface 注释,有且仅有一个未实现的方法,表示接收 Lambda 表达式,它们存在的意义在于将代码块作为数据打包起来。
JMCui
2018/12/24
1K0
基础篇:JAVA.Stream函数,优雅的数据流操作
平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看。java提供了Stream的概念,它可以让我们把集合数据当做一个个元素在处理,并且提供多线程模式
潜行前行
2020/12/11
6650
相关推荐
Java8 Stream,常用方法大合集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验