【Java】jdk 1.8 新特性——Lambda表达式

Lambda表达式

jdk 1.8 新加入的特性,简化了简单接口的实现

函数式接口

函数式中只有一个待实现的方法,可以使用@FunctionalInterface注解标注函数式接口.这个接口中只能有一个待实现的方法,但可以包含默认方法,静态方法以及Object类中的public方法

package Note.lambda_demo;@FunctionalInterface
public interface Demo01 {void test();default void defMethod() {System.out.println("default function");}static void staticMethod() {System.out.println("static function");}@Overrideboolean equals(Object object);
}

Lambda表达式的使用

在1.8之前,如果想要使用这样的接口,通常可以使用匿名内部类实现,

Demo01 demo01 = new Demo01() {@Overridepublic void test() {System.out.println("通过匿名内部类实现接口");}};

但现在可以更简单的使用

Demo01 demo01 = () -> {System.out.println("demo01");
};

lambda 的标准格式:

(args) -> {};
  • 没有参数括号中留白

  • 如果方法体只有一条语句,可以省略{},如:

    Demo01 demo01 = () -> System.out.println("lll");
    
  • 如果方法体只有一条return语句,可以简写,如:

    Demo02 demo02 = (int s) -> s * s;// 等效于Demo02 demo02 = (int s) -> {return s * s};
    
  • 如果方法体只返回一个新实例,可以简写为:

    Demo04 demo04 = HashMap::new;// 等效于Demo04 demo04 = () -> new HashMap();
    

自带函数接口

java.util.function 包下提供了很多内置的函数式接口,常用的有Predicate<T>Consumer<T>,以及Function<T, R>

Predicate

用来判断传入的值是否符合条件

@FunctionalInterface
public interface Predicate<T> {boolean test(T t);// ...
}

示例:

// 用来找出数组中的偶数
package Note.lambda_demo;import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.function.Predicate;public class Main {public Object[] filterInteger(int[] nums, Predicate<Integer> filter) {LinkedList<Integer> result = new LinkedList<Integer>();for (int i = 0; i < nums.length; i++) {if(filter.test(nums[i])){result.add(nums[i]);}}return result.toArray();}public static void main(String[] args) {Predicate<Integer> predicate = (Integer s) -> s % 2 == 0;int [] nums = {-1, 2, 8, -9, 0, 7, -5};Main main = new Main();System.out.println(Arrays.toString(main.filterInteger(nums, predicate)));}
}//~ [2, 8, 0]

Consumer

表示输入单个参数,返回某个值的操作

@FunctionalInterface
public interface Consumer<T> {void accept(T t);
}

Function

@FunctionalInterface
public interface Function<T, R> {R apply(T t);
}

代表一类函数,这类函数接收一个T类型的参数,返回一个R类型的结果

其他

  • lambda表达式中可以省略参数类型

  • lambda表达式中可以使用实例变量、静态变量,以及局部变量

  • 如果两个函数式接口类似,可以简写,如:

    package Note.lambda_demo;@FunctionalInterface
    public interface Demo02 {int test(int a);
    }// 又有一个类似的接口Demo03
    package Note.lambda_demo;@FunctionalInterface
    public interface Demo03 {int test(int s);
    }
    

    使用时,可以用::简写

    Demo02 demo02 = (int s) -> s * s;demo01.test();
    System.out.println(demo02.test(13));Demo03 demo03 = demo02::test;
    System.out.println(demo03.test(10));
    

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

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

相关文章

【Todo】Java8新特性学习

参考这篇文章吧&#xff1a; http://blog.csdn.net/vchen_hao/article/details/53301073 还有一个系列转载于:https://www.cnblogs.com/charlesblc/p/6123380.html

jsp调整字体大小font_html font标签如何设置字体大小?

首先我们先来看看htmlfont标签是如何来设置字体大小的&#xff1a;都只到htmlfont标签是个专门用来设置字体的标签&#xff0c;虽然在html5中用的会很少(因为都用css样式来设置font标签里面的属性)&#xff0c;但是个人觉得font标签还是相当强大的标签的&#xff0c;为什么这么…

runtime官方文档

OC是一种面向对象的动态语言&#xff0c;作为初学者可能大多数人对面向对象这个概念理解的比较深&#xff0c;而对OC是动态语言这一特性了解的比较少。那么什么是动态语言&#xff1f;动态语言就是在运行时来执行静态语言的编译链接的工作。这就要求除了编译器之外还要有一种运…

【Java】synchronized关键字笔记

Java Synchronized 关键字 壹. Java并发编程存在的问题 1. 可见性问题 可见性问题是指一个线程不能立刻拿到另外一个线程对共享变量的修改的结果。 如&#xff1a; package Note.concurrency;public class Demo07 {private static boolean s true;public static void mai…

sql语句分析是否走索引_MySql 的SQL执行计划查看,判断是否走索引

在select窗口中&#xff0c;执行以下语句&#xff1a;set profiling 1; -- 打开profile分析工具show variables like %profil%; -- 查看是否生效show processlist; -- 查看进程use cmc; -- 选择数据库show PROFILE all; -- 全部分析的类型show index from t_log_account; ##查看…

SQL Server-数据类型(七)

前言 前面几篇文章我们讲解了索引有关知识&#xff0c;这一节我们再继续我们下面内容讲解&#xff0c;简短的内容&#xff0c;深入的理解&#xff0c;Always to review the basics。 数据类型 SQL Server支持两种字符数据类型&#xff0c;一种是常规&#xff0c;另外一种则是Un…

【随记】SQL Server连接字符串参数说明

废话不多说&#xff0c;请参见 SqlConnection.ConnectionString 。 转载于:https://www.cnblogs.com/xiesong/p/5749037.html

【设计模式 00】设计模式的六大原则

设计模式的六大原则 参考&#xff1a; 设计模式六大原则 1. 单一职责原则 一个类只负责一个明确的功能 优点&#xff1a; 降低类的复杂度&#xff0c;提高代码可读性和可维护性降低变更时对其他功能的影响 2. 里氏替换原则 **原则一&#xff1a;**若 o1 是 C1 的一个实例化…

pb retrieve时停止工作_大佬们挂在嘴边的PE、PB是什么?

在紧锣密鼓地准备科创50ETF的发行工作间隙&#xff0c;今天小夏先带你读懂最简单的PE、PB估值指标这两大指标。01、什么是PE&#xff08;市盈率&#xff09;PE&#xff0c;也就是市价盈利比率&#xff0c;简称市盈率。市盈率是指股票价格与每股收益&#xff08;每股收益&#x…

EF CodeFirst 如何通过配置自动创建数据库当模型改变时

最近悟出来一个道理&#xff0c;在这儿分享给大家&#xff1a;学历代表你的过去&#xff0c;能力代表你的现在&#xff0c;学习代表你的将来。 十年河东十年河西&#xff0c;莫欺少年穷 学无止境&#xff0c;精益求精 本篇为进阶篇&#xff0c;也是弥补自己之前没搞明白的地方,…

对AutoIt中控件和窗口的理解

经过尝试&#xff0c;对AutoIt中Control和Window有了新的认识&#xff0c;分享一下 1.Control 现在我想对一个WinForm架构的应用程序进行自动化操作&#xff0c;得到控件Advanced Mode属性为[Name:XXX]。 然而在该窗口中有多个相同属性的Control&#xff0c;而依该属性只能操作…

【设计模式 01】简单工厂模式(Simple factory pattern)

简单工厂模式 可以根据参数的不同返回不同类的实例 参考&#xff1a; CSDN|简单工厂模式 简单工厂通过传给工厂类的参数的不同&#xff0c;返回不同的对象&#xff0c;包括三部分组成&#xff1a; 具体的”产品“工厂类&#xff08;实例化并返回”产品“&#xff09;客户端&am…

[Hadoop]MapReduce多路径输入与多个输入

1. 多路径输入 FileInputFormat是所有使用文件作为其数据源的 InputFormat 实现的基类&#xff0c;它的主要作用是指出作业的输入文件位置。因为作业的输入被设定为一组路径&#xff0c; 这对指定作业输入提供了很强的灵活性。FileInputFormat 提供了四种静态方法来设定 Job 的…

pvrect r语言 聚类_R语言实现KEGG通路富集可视化

用过KEGG的朋友应该都很熟悉里面的通路地图。你是否想过如果自己可以控制通路图将自己的基因绘制在一个通路图中&#xff0c;那么今天给大家介绍一个新推出的Bioconductor软件包pathview。这个包可以进行KEGG富集分析。首先&#xff0c;我们不耐烦的介绍下Bioconductor包的安装…

【设计模式 02】策略模式( Strategy)

策略模式 参考&#xff1a; CSDN | 策略模式百家号 | 策略模式 如果某个系统需要不同的算法&#xff08;如超市收银的优惠算法&#xff09;&#xff0c;那么可以把这些算法独立出来&#xff0c;使之之间可以相互替换&#xff0c;这种模式叫做策略模式&#xff0c;它同样具有三个…

PL/SQL复合变量

复合变量可以将不同数据类型的多个值存储在一个单元中。由于复合类型可以由用户自己根据需要定义其结构&#xff0c;所以复合数据类型也称为自定义数据类型。在PL/SQL中&#xff0c;使用%TYPE声明的变量类型与数据表中字段的数据类型相同&#xff0c;当数据表中字段数据类型修改…

Android中使用am命令实现在命令行启动程序详解

在Android中&#xff0c;除了从界面上启动程序之外&#xff0c;还可以从命令行启动程序&#xff0c;使用的是命令行工具am. 复制代码代码如下:usage: am [subcommand] [options] start an Activity: am start [-D] -D: enable debugging send a broadcast Intent: am br…

用Visual Studio 2019连接 WSL来编译调试C/C++项目

因为有作业要在Linux环境下写&#xff0c;用虚拟机直接卡成PPT&#xff0c;VS code又不会调试&#xff0c;就搞一下VS 2019吧。 环境 windows 10 WSL(Ubuntu 18.04.4) Visual Studio Community 2019 Linux 里要有C/C环境&#xff08;gcc等&#xff09;VS要有 适用于 Linux…

node.js Websocket消息推送---GoEasy

Goeasy, 它是一款第三方推送服务平台&#xff0c;使用它的API可以轻松搞定实时推送&#xff01;个人感觉goeasy推送更稳定&#xff0c;推送速度快&#xff0c;代码简单易懂上手快浏览器兼容性&#xff1a;GoEasy推送支持websocket 和polling两种连接方式&#xff0c;从而可以支…

git 移动分支指针_理解git 中的HEAD指针branch指针

HEAD指针使用git checkout 来移动HEAD指针&#xff0c;移动的对象可以是分支指针也可以是快照。HEAD指针可以指向快照也可以指向branch。当指向branch时提交后会和branch指针一起向后移动&#xff0c;当不指向branch提交时时则会在一个detached状态。分支(branch)指针使用git b…