lambda ::表达式_Lambda表达式和流API:基本示例

lambda ::表达式

这篇博客文章包含基本Lambda表达式和Stream API示例的列表,我在2014年6月在Java用户组Politechnica Gedanensis (格但斯克技术大学)和Goyello的实时编码演示中使用了这些示例。

Lambda表达式

句法

最常见的示例:

Runnable runnable = () -> System.out.println("Hello!");
Thread t = new Thread(runnable);
t.start();
t.join();

可以这样写:

Thread t = new Thread(() -> System.out.println("Hello!"));
t.start();
t.join();

那参数呢?

Comparator<String> stringComparator = (s1, s2) -> s1.compareTo(s2);

并扩展为完整表达:

Comparator<String> stringComparator = (String s1, String s2) -> {System.out.println("Comparing...");return s1.compareTo(s2);
};

功能界面

Lambda表达式使您可以更紧凑地表达单方法类的实例。 单方法类称为函数接口, 可以使用@FunctionalInterface进行注释:

@FunctionalInterface
public interface MyFunctionalInterface<T> {boolean test(T t);
} // Usage
MyFunctionalInterface<String> l = s -> s.startsWith("A");

方法参考

方法引用是紧凑的,易于阅读的lambda表达式,用于具有名称的方法。 让我们看一个简单的例子:

public class Sample {public static void main(String[] args) {Runnable runnable = Sample::run;}private static void run() {System.out.println("Hello!");}
}

另一个例子:

public static void main(String[] args) {Sample sample = new Sample();Comparator<String> stringLengthComparator = sample::compareLength;
}private int compareLength(String s1, String s2) {return s1.length() - s2.length();
}

流API –基础

流是支持顺序和并行批量操作的一系列元素。

遍历列表

List<String> list = Arrays.asList("one", "two", "three", "four", "five", "six");list.stream().forEach(s -> System.out.println(s));

筛选

Java 8在接口中引入了默认方法。 它们在Stream API中非常方便:

Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;list.stream().filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree)).forEach(s -> System.out.println(s));

排序

Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();list.stream().filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree)).sorted(byLastLetter.thenComparing(byLength)).forEach(s -> System.out.println(s));

另外,在上述例子的默认方法andjava.util.function.Predicate被使用。 默认(和静态)方法是Java 8中接口的新增方法。

限制

Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();list.stream().filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree)).sorted(byLastLetter.thenComparing(byLength)).limit(4).forEach(s -> System.out.println(s));

收集到清单

Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();List<String> result = list.stream().filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree)).sorted(byLastLetter.thenComparing(byLength)).limit(4).collect(Collectors.toList());

并行处理

我使用了一个非常常见的示例来遍历文件列表:

public static void main(String[] args) {File[] files = new File("c:/windows").listFiles();Stream.of(files).parallel().forEach(Sample::process);
}private static void process(File file) {try {Thread.sleep(1000);} catch (InterruptedException e) {}System.out.println("Processing -> " + file);
}

请注意,在显示示例时,我解释了并行处理流的一些已知缺点。

流API –更多示例

制图

遍历目录中的文件并返回FileSize对象:

class FileSize {private final File file;private final Long size;FileSize(File file, Long size) {this.file = file;this.size = size;}File getFile() {return file;}Long getSize() {return size;}String getName() {return getFile().getName();}String getFirstLetter() {return getName().substring(0, 1);}@Overridepublic String toString() {return Objects.toStringHelper(this).add("file", file).add("size", size).toString();}
}

映射的最终代码:

File[] files = new File("c:/windows").listFiles();
List<FileSize> result = Stream.of(files).map(FileSize::new).collect(Collectors.toList());

分组

按文件名的首字母对FileSize对象进行分组:

Map<String, List<FileSize>> result = Stream.of(files).map(FileSize::new).collect(Collectors.groupingBy(FileSize::getFirstLetter));

减少

获取目录中最大/最小的文件:

Optional<FileSize> filesize = Stream.of(files).map(FileSize::new).reduce((fs1, fs2) -> fs1.getSize() > fs2.getSize() ? fs1 : fs2);

如果您不需要FileSize对象,而只需要一个数字:

OptionalLong max = Stream.of(files).map(FileSize::new).mapToLong(fs -> fs.getSize()).max();

翻译自: https://www.javacodegeeks.com/2014/06/lambda-expressions-and-stream-api-basic-examples.html

lambda ::表达式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android readonly file system,安卓ROOT权限下“Read-only file sytem”解决办法

今天用安卓模拟器&#xff1a;BlueStacks&#xff0c;打开apk终端模拟器&#xff1a;Terminal&#xff0c;在shell操作命令的时候提示“Read-only file sytem”&#xff1a;第一种方法&#xff1a;在 Android 系统中&#xff0c;我们通过 adb 登录到 shell 进行操作时&#xff…

客制化键盘编程_客制化键盘劝退指南

客制化键盘劝退指南最近总感觉mac book pro的键盘不太好用&#xff0c;所以把家里用的杜伽K320拿到公司用了。这把键盘&#xff0c;樱桃的银轴&#xff0c;红轴的压力克数&#xff0c;更小的键程&#xff0c;用起来还是不错的。如此一来&#xff0c;家里的台式机没有键盘了&…

HTML5怎样设置站点,我是怎样让网站用上HTML5 Manifest

Manifest是用来做离线页面的&#xff0c;即使断网也能正常打开页面&#xff0c;用起来简单&#xff0c;但是在实际使用中存在以下问题&#xff1a;(1)如何自动缓存所有的页面的资源&#xff1f;因为manifest不能使用*通配符进行cache(2)如果网站资源更新&#xff0c;怎么让mani…

wallpaper怎么设置锁屏_Apple ID密码忘了怎么找回?丨如何让面容和指纹解锁立马失效?...

忘记Apple ID这种事肯定不少果粉都经历过&#xff0c;像小编也是如此&#xff0c;因为密码都比较复杂&#xff0c;如果太久没输入过密码&#xff0c;久而久之就忘了。哪一天突然需要用的时候&#xff0c;怎么想也想不起来。想不起来的话我们就别想了&#xff0c;直接重置密码就…

在Java中将时间单位转换为持续时间

java.util.concurrent.TimeUnit以给定的粒度单位表示Java中的持续时间&#xff0c;并提供了跨单位转换的实用方法。 java.util.concurrent.TimeUnit最早是在Java早期&#xff08;1.5&#xff09;引入的&#xff0c;但自那时以来已经被扩展了好几次。 在此博客文章中&#xff0c…

ajax contenttype详解_$.ajax中contentType: “application/json” 的用法详解

具体内容如下所示&#xff1a;$.ajax({type: httpMethod,cache:false,async:false,contentType: "application/json; charsetutf-8",dataType: "json",//返回值类型url: pathurl,data:jsonData,success: function(data){var resultData 返回码data.status…

在text html模版中写js,Rails3使用text/html内容类型而不是text/javascript呈现js.erb模板...

我正在使用3.0.0.beta3构建一个新的应用程序.我只是尝试将js.erb模板呈现给Ajax请求以执行以下操作(在publications_controller.rb中):def get_pubmed_dataentry Bio::PubMed.query(params[:pmid])# searches PubMed and get entrypublication Bio::MEDLINE.new(entry) # cre…

jq监听子元素被点击_vue开发app点击字母展示地区列表(兄弟组件之间联动)

下图这种地区搜索方式在很多app中都很常见&#xff0c;今天就使用vue框架中的 better-scroll 第三方包来实现页面滚动和点击侧边栏字母该字母开头的地区列表置顶功能。1、A子组件通过使用 this.$emit(事件名字&#xff0c;事件携带内容) 向外触发事件首先&#xff0c;在组件每个…

e-mobile帐号状态存在异常_一文掌握异常检测的实用方法 | 技术实践

作者 | Vegard Flovik译者 | Tianyu责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】今天这篇文章会向大家介绍几个有关机器学习和统计分析的技术和应用&#xff0c;并展示如何使用这些方法解决一些具体的异常检测和状态监控实例。相信对一些开发…

用Spring组成自定义注释

Java批注在2004年随Java 5一起引入&#xff0c;是一种将元数据添加到Java源代码中的方法。 如今&#xff0c;许多主要框架&#xff08;如Spring或Hibernate&#xff09;都严重依赖注释。 在本文中&#xff0c;我们将介绍一个非常有用的Spring功能&#xff0c;该功能允许我们基…

单片机sleep函数的头文件_单片机代码模块化设计思想浅谈

前言&#xff1a;前段时间分享的文章【单片机裸机代码框架设计思路】&#xff0c;很多读者给我留言&#xff0c;觉得很不错&#xff0c;对于初学者而言&#xff0c;这是一个进阶的技巧&#xff0c;对于我而言&#xff0c;这是对自己总结和表达能力的一个提升。本文章我们再谈谈…

html中显示数据库中的一条数据,如何使用html表显示数据库中的数据

我正在尝试在HTML表中显示数据库中的数据。主要问题是&#xff1a;该表未出现。IdStringArray// Mostrar dadosecho "{$databaseName visteon;$pdo new Pdo(mysql:host127.0.0.1;dbname . $databaseName, root, );$result $pdo->query(SHOW TABLES FROM . $databas…

jquery 字符串查找_JQuery、Vue等考点

一. 写出下面程序的运行结果for结果&#xff1a;1秒后一下子打印出5个5。当循环完成时才会轮到setTimeout异步执行其回调函数function&#xff0c;此时i已经变成5&#xff0c;故5个console.log(i)里的i全使用的是5。易错点&#xff1a;千万别写成“打印5个4”啊&#xff01;暴风…

html网页效果分析,熟手的html编写风格与原因分析_HTML/Xhtml_网页制作

一、导航&#xff1a;无序列表 对 其它标签元素用最常用的“无序列表“来写导航的理由是显而易见的&#xff0c;它代表一列链接&#xff0c;这本身就有足够的理由应选择列表标签。但需要移除list列表的默认样式&#xff0c;以使其更有意义。另一个好处可能超出你的想象&#xf…

qgis 图片_QGIS入门教程公告!!!

从本周开始&#xff0c;我将每周日更新一期QGIS入门教程视频&#xff0c;带讲解&#xff0c;估计这也是很多朋友所希望的。操作中用到的数据下载链接我会放在每一期的视频下方。以下是入门课程的目录&#xff1a;1.开启你的QGIS之旅——制作你的第一张地图2.属性表基础——字段…

v-if 表单验证_避免许多if块进行验证检查

v-if 表单验证在某些情况下&#xff0c;我们需要先验证输入数据&#xff0c;然后再将其发送到业务逻辑层进行处理&#xff0c;计算等。这种验证在大多数情况下是孤立进行的&#xff0c;或者可能包括与外部数据或其他输入的一些交叉检查。 看下面的示例&#xff0c;该示例验证用…

css less 不要作用到子对象_CSS-预处理语言Sass、Less简述

CSS作为前端开发的三驾马车之一&#xff0c;无时无刻不在影响着前端的发展。为了让 CSS 变得更加的好用&#xff0c;出现了一些预处理语言。 它们让 CSS 彻底变成一门可以使用变量 、循环 、继承 、自定义方法等多种特性的标记语言&#xff0c;逻辑性得以大大增强SassSass是成熟…

html图片平铺div,前端小知识——图片平铺问题

图片平铺有两种方式&#xff0c;直接写img标签或者通过background-image方式1&#xff0c;img标签HTML&#xff1a;CSS:.row{margin:0,auto;width:100%;}img{width:100%;height:100%;margin: 0 auto;display: block;font-size: 0;}这样写的话&#xff0c;三张图片能够垂直平铺&…

JMetro版本11.6.8和8.6.8发布

另一个版本&#xff0c;这次是较短的更新。 撰写文档和博客文章有点不知所措&#xff0c;但是我认为我不得不更新文档&#xff0c;因为它已经被更新了大约一年或更长时间。 因此&#xff0c;对于此发行版&#xff0c;我也专注于此。 这是链接&#xff1a; Javafx主题JMetro页面…

python用pip安装numpy mac_小白入门Python,mac下如何安装pip、ipython

作为一枚小白&#xff0c;最近在学习用Python写科学计算器&#xff0c;因为Mac不自带pip&#xff0c;安装的时候找了好几个帖子&#xff0c;才成功安装。做一下简单分享&#xff0c;希望对大家有帮助&#xff1a; 安装环境&#xff1a; Mac系统版本&#xff1a;OS X 10.11.1 Py…