1.概述

Lambda是一个匿名函数,是java8的一个新特性。可以对接口进行非常简洁的实现。但它要求接口中只能有一个抽象方法,原因是lambda只能实现一个方法。另外,需要在接口上添加注解@FunctionalInterface,添加此注解,也是说明此接口可以通过labmda进行实现,也就限制了此接口只能有一个抽象方法,如果有多个就会报错。

2.基础语法

2.1无参无返回值

接口:

@FunctionalInterface
public interface MyLambda {
void test();
}

调用:

public static void main(String[] args) {
//创建对象
MyLambda lambda = () -> {
System.out.println("我是无参无返回值的方法");
};
//调用方法
lambda.test();
}

2.2无参有返回值

接口:

@FunctionalInterface
public interface MyLambda {
int test();
}

调用:

public static void main(String[] args) {
//创建对象
MyLambda lambda = () -> {
System.out.println("我是无参有返回值的方法");
return 1;
};
//调用方法
System.out.println(lambda.test());
}

2.3单参无返回值

接口:

@FunctionalInterface
public interface MyLambda {
void test(int a);
}

调用:

public static void main(String[] args) {
//创建对象
MyLambda lambda = (int a) -> {
System.out.println("我是单参无返回值的方法,参数是:"+a);
};
//调用方法
lambda.test(10);
}

2.4多参无返回值

接口:

@FunctionalInterface
public interface MyLambda {
void test(int a,int b,int c);
}

调用:

 public static void main(String[] args) {
//创建对象
MyLambda lambda = (int a,int b,int c) -> {
System.out.println("我是多参无返回值的方法,参数是:"+a+","+b+","+c);
};
//调用方法
lambda.test(10,20,15);
}

2.5单参有返回值

接口:

@FunctionalInterface
public interface MyLambda {
int test(int a);
}

调用:

public static void main(String[] args) {
//创建对象
MyLambda lambda = (int a) -> {
System.out.println("我是单参有返回值的方法,参数是:"+a);
return a*3;
};
//调用方法
System.out.println(lambda.test(10));
}

2.6多参有返回值

接口:

@FunctionalInterface
public interface MyLambda {
int test(int a,int b,int c);
}

调用:

public static void main(String[] args) {
//创建对象
MyLambda lambda = (int a,int b,int c) -> {
System.out.println("我是多参有返回值的方法,参数是:"+a+","+b+","+c);
return a+b+c;
};
//调用方法
System.out.println(lambda.test(10, 20, 15));
}

2.7语法简化

1)参数类型。由于在接口的抽象方法中已经定义了参数的类型,那么在lambda中就可以省略参数。需要注意的是,如果要省略参数类型,就必须省略全部的参数类型。

2)参数小括号。如果参数只有一个时,可以省略小括号。

3)参数大括号。如果方法体中只有一条语句,可以省略大括号。如果需要返回值,则要同时省略return关键字。

实例1:参数类型省略

public static void main(String[] args) {
//创建对象
MyLambda lambda = (a) -> {
return a*3;
};
//调用方法
System.out.println(lambda.test(10));
}

实例2:参数小括号省略

public static void main(String[] args) {
//创建对象
MyLambda lambda = a -> {
return a*3;
};
//调用方法
System.out.println(lambda.test(10));
}

实例3:参数大括号省略

public static void main(String[] args) {
//创建对象
MyLambda lambda = a -> a * 3;
//调用方法
System.out.println(lambda.test(10));
}

2.8方法的引用

它的作用是把一个lambda表达式实现指向一个已经实现的方法。

语法:方法的隶属者::方法名

先看下面的一个实例:接口参考2.6。

public static void main(String[] args) {
//创建对象
MyLambda lambda = (a,b,c) -> a+b+c;
//创建对象
MyLambda lambda2 = (a,b,c) -> a+b+c;
//调用方法
System.out.println(lambda.test(10,30,20));
}

如果在一个方法中对接口进行多次的实现,方法体的内容是一样的,写的也是比较麻烦的,那么此时就可以把方法体的内容写到一个新的方法中,然后去调用方法即可,再次调用时使用方法的引用就好。

public class LambdaTest {

    public static void main(String[] args) {
//创建对象
MyLambda lambda = (a,b,c) -> add(a,b,c);
//方法的引用,类名::方法名
MyLambda lambda2 = LambdaTest::add;
//调用方法
System.out.println(lambda.test(10,30,20));
System.out.println(lambda2.test(10,30,20));
}
private static int add(int a,int b,int c){
return a+b+c;
} }

3.核心函数式接口

3.1说明

在java中有四大内置的函数式接口,为接口的实现提供了方便,见下表:

接口名 方法 参数 返回值 说明
Predicate
boolean test(T t);
T boolean 断言型接口
Consumer
void accept(T t);
T 消费型接口
Function
R apply(T t)
T、R R 函数型接口
Supplier
T get();
T 供给型接口

这些接口的使用下面详细介绍。

3.2Predicate

   //将满足条件的字符串,放到集合中
public List<String> filterStr(List<String> list, Predicate<String> pre){
List<String> newList=new ArrayList<>();
for (String str:list) {
if(pre.test(str)){
newList.add(str);
}
}
return newList;
} @Test
public void test(){
List<String> list= Arrays.asList("idea","eclipse","predicate","function");
List<String> returnList= filterStr(list,(str)->str.length()>4);
for (String str:returnList) {
System.out.println(str);
}
}

3.3Consumer

   //对接口进行实现
public void shopping(double money, Consumer<Double> con) {
con.accept(money);
} @Test
public void test() {
shopping(1000, x -> System.out.println("今天购物花了" + x + "元"));
}

3.4Function

   //处理字符串
public String handlerStr(String str, Function<String,String> fun){
return fun.apply(str);
} @Test
public void test(){
String newStr= handlerStr("hello world,lambda",(str)->str.substring(3,6));
System.out.println(newStr);
}

3.5Supplier

    //产生指定个数的整数,放到集合中并返回
public List<Integer> getNumList(int num, Supplier<Integer> sup) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
Integer n = sup.get();
list.add(n);
}
return list;
} @Test
public void test() {
List<Integer> numList = getNumList(3, () -> (int) (Math.random() * 10));
for (Integer n : numList) {
System.out.println(n);
}
}

4.lambda综合应用

4.1forEach遍历集合

        Map<String, Integer> map = new HashMap<>();
map.put("zhangs", 20);
map.put("lisi", 10);
map.put("wangwu", 40);
map.put("liliu", 30);
map.forEach((key, value) -> System.out.println(key + "," + value));

集合可以使用forEach方法遍历,这里主要介绍遍历map。

4.2集合list排序

List<Integer> list = Arrays.asList(10, 50, 30, 20, 15, 80, 90);
list.sort((o1, o2) -> o1 - o2);
System.out.println(list);

4.3集合treeSet排序

    TreeSet<Integer> set = new TreeSet<>((o1, o2) -> {
if (o1 <= o2) {
return -1;
} else {
return 1;
}
});
set.add(10);
set.add(15);
set.add(20);
set.add(10);
set.add(50);
set.add(30);
set.add(9);
System.out.println(set);

4.4removeIf()

删除集合中符合条件的方法

        List<Integer> list = new ArrayList<>();
list.add(10);
list.add(50);
list.add(30);
list.add(20);
list.add(15);
list.add(80);
list.add(90);
//删除小于50的元素
list.removeIf(o -> o < 50);
System.out.println(list);

4.5开启线程

      Thread thread=new Thread(()->{
for (int i = 0; i < 20; i++) {
System.out.println(i);
}
}); thread.start();

Lambad表达式--Java8新特性的更多相关文章

  1. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

  2. java8新特性(二)_lambda表达式

    最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看<写给大忙人看的JavaSE8> ...

  3. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  4. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  5. Java8新特性之Lambda表达式

    lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ...

  6. JAVA8新特性——Lamda表达式

    JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类. 先来看看传统的匿名 ...

  7. java8新特性——Lambda表达式

    上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...

  8. Java8 新特性之Lambda表达式

    1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ...

  9. Java8新特性(一)——Lambda表达式与函数式接口

    一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...

随机推荐

  1. cassandra权威指南读书笔记--读写数据

    写cassandra除了轻量级事务,不支持别的事务.cassandra是追加写,写的速度非常快.cassandra还有hint日志,这个数据库总是可写的,而且单个列的写操作是原子的.hint并不是一定 ...

  2. Flink-v1.12官方网站翻译-P017-Execution Mode (Batch/Streaming)

    执行模式(批处理/流处理) DataStream API 支持不同的运行时执行模式,您可以根据用例的要求和作业的特点从中选择.DataStream API 有一种 "经典 "的执行 ...

  3. 四十三:漏洞发现-WEB应用之漏洞探针类型利用修复

    已知CMS 如常见的dedecms,discuz,wordpress等源码结构,这种一般采用非框架开发,但是也有少部分采用框架类开发,针对此类源码程序的安全监测, 我们要利用公开的漏洞进行测试,如不存 ...

  4. 6.PowerShell DSC核心概念之LCM

    什么是LCM? 本地配置管理器 (LCM) 是DSC的引擎. LCM 在每个目标节点上运行,负责分析和执行发送到节点的配置. 它还负责 DSC 的许多方面,包括以下各方面. 确定刷新模式(推送或请求) ...

  5. SpringBoot整合Swagger初探

    当下的Web项目大都采用前后端分离+分布式微服务的架构.前后端分离式的开发中,前端开发人员要与后端开发人员协商通信接口,约定接口规范.因此对于开发人员来说能够维持一份及时更新且完整全面的API文档会大 ...

  6. OpenStack Train版-11.安装horizon服务(计算节点)

    OpenStack仪表板Dashboard服务的项目名称是Horizon,它所需的唯一服务是身份服务keystone,开发语言是python的web框架Django. 安装Train版本的Horizo ...

  7. 二进制安装kubernetes(六) kube-proxy组件安装

    Kube-Proxy简述 参考文献: https://ywnz.com/linuxyffq/2530.html 运行在每个节点上,监听 API Server 中服务对象的变化,再通过管理 IPtabl ...

  8. 2019牛客多校第二场F Partition problem(暴搜)题解

    题意:把2n个人分成相同两组,分完之后的价值是val(i, j),其中i属于组1, j属于组2,已知val表,n <= 14 思路:直接dfs暴力分组,新加的价值为当前新加的人与不同组所有人的价 ...

  9. Media Queries语法总结

    Media Queries的语法如下所示: @media [media_query] media_type and media_feature 使用Media Queries样式模块时都必须以&quo ...

  10. 最新 Markdown for GitHub教程

    Markdown 教程 Markdown 是什么? Markdown 是一种方便记忆.书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档:譬如您正在阅读的这份文档. 它 ...