java8总结

news/2024/6/16 19:18:33

java8总结

  • java8新特性总结
      • 1. 行为参数化
      • 2. lambda表达式
        • 2.1 函数式接口
        • 2.2 函数描述符
      • 3. Stream API
        • 3.1 付诸实践

java8新特性总结

  • 行为参数化
  • lambda表达式
  • Stream Api

1. 行为参数化

  • 定义:行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们,完成不同行为的能力。

  • 行为参数化可让代码更好地适应不断变化的要求,减轻未来的工作量。传递代码,就是将新行为作为参数传递给方法。

  • 方法引用:在Java 8里写下 类::方法名的时候,你就创建了一个方法引用,你同样可以传递它。

package org.study.firstbase;import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;/*** Hello world!*/
public class AppFilter {public static void main(String[] args) {testPredicate();}public static void testPredicate() {List<Apple> apples = new ArrayList<Apple>();apples.add(new Apple("green", 140));apples.add(new Apple("green", 160));apples.add(new Apple("red", 140));apples.add(new Apple("red", 160));List<Apple> result = filterApples(apples, Apple::isGreenApple);for (Apple apple : result) {System.out.println(apple);}List<Apple> result2 = filterApples(apples, Apple::isHeavyApple);for (Apple apple : result2) {System.out.println(apple);}}static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {List<Apple> result = new ArrayList<Apple>();for (Apple apple : inventory) {if (p.test(apple)) {result.add(apple);}}return result;}
}

2. lambda表达式

你可以在函数式接口上使用Lambda表达式

2.1 函数式接口

在这里插入图片描述

2.2 函数描述符

函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。我们将这种抽象方法叫作函数描述符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. Stream API

  • 流是“从支持数据处理操作的源生成的一系列元素”。
  • 流操作有两类:中间操作终端操作
  • 谓词:一个返回 boolean的函数
  • 总结
    • Streams API可以表达复杂的数据处理查询。常用的流操作总结在表5-1中。
    • 你可以使用filter、distinct、skip和limit对流做筛选和切片。
    • 你可以使用map和flatMap提取或转换流中的元素。 你可以使用findFirst和findAny方法查找流中的元素。你可以用allMatch、noneMatch和anyMatch方法让流匹配给定的谓词。
    • 这些方法都利用了短路:找到结果就立即停止计算;没有必要处理整个流。
    • 你可以利用reduce方法将流中所有的元素迭代合并成一个结果,例如求和或查找最大元素。
    • filter和map等操作是无状态的,它们并不存储任何状态。reduce等操作要存储状态才能计算出一个值。sorted和distinct等操作也要存储状态,因为它们需要把流中的所有元素缓存起来才能返回一个新的流。这种操作称为有状态操作。
    • 流有三种基本的原始类型特化:IntStream、DoubleStream和LongStream。它们的操
      作也有相应的特化。
    • 流不仅可以从集合创建,也可从值、数组、文件以及iterate与generate等特定方法
      创建。
    • 无限流是没有固定大小的流。
      在这里插入图片描述
3.1 付诸实践

在本节中,你会将迄今学到的关于流的知识付诸实践。我们来看一个不同的领域:执行交易的交易员。你的经理让你为八个查询找到答案。你能做到吗?我们在5.5.2节给出了答案,但你应 该自己先尝试一下作为练习。

(1) 找出2011年发生的所有交易,并按交易额排序(从低到高)。 (2) 交易员都在哪些不同的城市工作过?
(3) 查找所有来自于剑桥的交易员,并按姓名排序。
(4) 返回所有交易员的姓名字符串,按字母顺序排序。
(5) 有没有交易员是在米兰工作的?
(6) 打印生活在剑桥的交易员的所有交易额。 (7) 所有交易中,最高的交易额是多少?
(8) 找到交易额最小的交易。

package org.study.streamApi;import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;public class CaseTask {public static void main(String[] args) {Trader raoul = new Trader("Raoul", "Cambridge");Trader mario = new Trader("Mario","Milan");Trader alan = new Trader("Alan","Cambridge");Trader brian = new Trader("Brian","Cambridge");List<Transaction> transactions = Arrays.asList(new Transaction(brian, 2011, 300),new Transaction(raoul, 2012, 1000),new Transaction(raoul, 2011, 400),new Transaction(mario, 2012, 710),new Transaction(mario, 2012, 700),new Transaction(alan, 2012, 950));//(1) 找出2011年发生的所有交易,并按交易额排序(从低到高)。transactions.stream().filter(d -> d.getYear() == 2011).sorted(Comparator.comparing(Transaction::getValue)).forEach(System.out::println);//(2) 交易员都在哪些不同的城市工作过?transactions.stream().map(t -> t.getTrader().getCity()).distinct().forEach(System.out::println);//(3) 查找所有来自于剑桥的交易员,并按姓名排序。transactions.stream().map(t -> t.getTrader()).filter(t -> t.getCity().equals("Cambridge")).distinct().sorted(Comparator.comparing(Trader::getName)).forEach(System.out::println);//(4) 返回所有交易员的姓名字符串,按字母顺序排序。transactions.stream().map(t -> t.getTrader().getName()).distinct().sorted((x, y) -> x.compareTo(y)).forEach(System.out::println);//(5) 有没有交易员是在米兰工作的?boolean milan = transactions.stream().anyMatch(t -> t.getTrader().getCity().equals("Milan"));System.out.println(milan);//(6) 打印生活在剑桥的交易员的所有交易额。transactions.stream().filter(t -> t.getTrader().getCity().equals("Cambridge")).map(Transaction::getValue).forEach(System.out::println);//(7) 所有交易中,最高的交易额是多少?Optional<Integer> maxValue = transactions.stream().map(Transaction::getValue).reduce(Integer::max);System.out.println(maxValue.get());//(8) 找到交易额最小的交易。Optional<Integer> minValue = transactions.stream().map(Transaction::getValue).reduce(Integer::min);System.out.println(minValue.get());}
}

http://www.mrgr.cn/p/13432560

相关文章

详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版)

目录 前言1. 基本知识2. Demo3. 实战4. 模版 前言 由于需要在登录时&#xff0c;附上一些用户说明书的弹窗 对于ElMessageBox的基本知识详细了解 可通过官网了解基本的语法知识ElMessageBox官网基本知识 1. 基本知识 Element Plus 是一个基于 Vue 3 的组件库&#xff0c;其中…

java文档管理系统的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的文档管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 文档管理系统的…

C++容器之映射(std::map)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 iterators3.4 capacity3.5 access3.6 insert3.7 erase3.8 swap3.9 clear3.10 emplace3.11 emplace_hint3.12 key_comp3.13 value_comp3.14 find/count3.15 upper_bound/upper_bound/equal_range3.16 get_allocator…

TALLRec论文阅读笔记

TALLRec: An Effective and Efficient Tuning Framework to Align Large Language Model with Recommendation论文阅读笔记 Abstract 存在的问题: ​ 由于LLM的训练任务和推荐任务之间存在显著差异,以及训练前的推荐数据不足,LLM在推荐任务中的表现仍然不理想。 解决方案: …

NumPy 正态分布与 Seaborn 可视化指南

正态分布(高斯分布)是重要的概率模型,具有钟形曲线特征,由均值μ和标准差σ描述。NumPy的`random.normal()`可生成正态分布随机数,Seaborn库方便绘制分布图。正态分布广泛应用于统计学、机器学习、金融和工程等领域。练习包括生成正态分布数据、比较不同标准差影响及模拟考…

使用本地大语言模型和Langchain手搓免费的AI搜索问答助手

1 概述 大语言模型虽然已经有了很多的背景知识,但针对模型训练之后新产生的内容,或者领域内的知识进行提问,大模型本身通常无法准确给出回应,一个常用的解决方法是,借助检索增强生成(RAG),将能够用于回答问题的相关上下文给到大模型,利用大模型强大的理解和生成能力,…

免费,Python蓝桥杯等级考试真题--第6级(含答案解析和代码)

Python蓝桥杯等级考试真题–第6级 一、 选择题 答案&#xff1a;D 解析&#xff1a;4411*4&#xff0c;超出范围&#xff0c;故答案为D。 答案&#xff1a;B 解析&#xff1a;5<8<10&#xff0c;故答案为B。 答案&#xff1a;A 解析&#xff1a;先比较a&#xff0c;然后…

Further Generalizations of the Jaccard Index

目录概Jaccard Index推广到 multisets推广到 Multiple setsCosta L. Further generalizations of the jaccard index. 2021.概 本文介绍了 Jaccard Index (Jaccard Similarity), 和它的一些变种. Jaccard Index对于两个普通的集合 \(A, B\), 它们的 Jaccard Index 为 \[J(A, B…

deepseek是哪家公司

deepblue是什么公司 DeepSeek是杭州深度求索人工智能基础技术研究有限公司的简称。12 杭州深度求索人工智能基础技术研究有限公司&#xff0c;成立于2023年&#xff0c;位于浙江省杭州市&#xff0c;是一家专注于研究和试验发展的企业。该公司的注册资本为1000万人民币&…

终端安全管理系统、天锐DLP(数据泄露防护系统)| 数据透明加密保护,防止外泄!

终端作为企业员工日常办公、数据处理和信息交流的关键工具&#xff0c;承载着企业运营的核心信息资产。一旦终端安全受到威胁&#xff0c;企业的敏感数据将面临泄露风险&#xff0c;业务流程可能遭受中断&#xff0c;甚至整个企业的运营稳定性都会受到严重影响。 因此&#xff…

无网环境禁止 WPS 提示登录,且基本功能按钮可用

目前 WPS 升级后&#xff0c;每次打开都会提示你登录 WPS&#xff0c;并且在未登录之前所有基本功能按钮是置灰状态&#xff0c;无法使用。 如此一来&#xff0c;在内网或无网环境&#xff0c;我们无法登陆 WPS &#xff0c;就给我们的使用带来了极大的不便&#xff0c;那么有没…

院图片库兼容性修复

图片库问题处理 原工程文件使用node-sass,而新版node.js已经弃用,应卸载node-sass,重新安装dart-sass 1.卸载node-sass npm uninstall node-sass2.安装dart-sass npm install sass sass-loader -D3.安装所有包 npm install4.修改element-plus配置 https://zhuanlan.zhihu.co…

rbenv:Ruby 多版本管理利器

在 Ruby 开发的世界中,经常需要面对不同项目使用不同 Ruby 版本的情况。这时,一个高效、灵活且易于使用的 Ruby 版本管理工具就显得尤为重要。 rbenv 正是这样一个工具,它允许开发者在同一台计算机上轻松安装、切换和管理多个 Ruby 版本。本文将详细介绍 rbenv 的安装、基本…

GPT搜索引擎原型曝光!

OpenAI发布会前一天&#xff0c;员工集体发疯中……上演大型套娃行为艺术。 A&#xff1a;我为B的兴奋感到兴奋&#xff1b;B&#xff1a;我为C的兴奋感到兴奋……Z&#xff1a;我为这些升级感到兴奋 与此同时还有小动作不断&#xff0c;比如现在GPT-4的文字描述已不再是“最先…

海山数据库(He3DB)代理ProxySQL使用详解:(二)功能实测

读写分离实测 ProxySQL官方demo演示了三种读写分离的方式&#xff1a;使用不同的端口进行读写分离、使用正则表达式进行通用的读写分离、使用正则和digest进行更智能的读写分离。最后一种是针对特定业务进行的优化调整&#xff0c;也可将其归结为第二种方式&#xff0c;下边分…

Docker(四) 文件和网络

1 Dockerfile 1.1 什么是Dockerfile Dockerfile是一个文本文件&#xff0c;包含一系列命令&#xff0c;这些命令用于在 Docker 镜像中自动执行操作。Dockerfile 定义了如何构建 Docker 镜像的步骤和所需的操作。 Dockerfile 中包含的命令可以设置和定制容器的环境&#xff0c;…

Viso的对象图形复制到word,发现图形画布底部有大量空白,如何解决

1 viso对象插入到word VIso的图可以作为对象插入到word中,直接复制即可,复制后,可以在word中双击,关联到viso中,进行更改,很方便。 正常情况下,在viso中做好图形后,直接复制到word中即可,在word中双击,关联到viso中。如下图:偶尔会存在一些格式比例大小的问题,导致…

马蹄集 oj赛(双周赛第二十七次)

目录 栈的min 外卖递送 奇偶序列 sort 五彩斑斓的世界 括号家族 名次并列 栈间 双端队列 合并货物 逆序对 活动分组 栈的min 难度:黄金巴 占用内存:128 M时间限制:1秒 小码哥又被安排任务了&#xff0c;这次他需要要设计一个堆栈&#xff0c;他除了可以满足正常的栈…

变频器通过Modbus转Profinet网关连接电机与PLC通讯

Modbus转Profinet网关(XD-MDPN100)是一种能够实现Modbus协议和Profinet协议之间转换的设备。Modbus转Profinet网关可提供单个或多个RS485接口,PLC作为控制中枢,变频器作为控制电机转速,通过Modbus转Profinet网关,实现对电机的远程监控和调节,使得生产过程更加智能化和精…