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. 4. DHCP配置(Windows2012)

    1.点击服务器管理器 2.选择添加角色和功能 3. 按照添加角色和功能向导来添加 保持默认,下一步 保持默认,下一步 保持默认,下一步 勾选DHCP服务器,在弹出的小窗点击添加功能. 保持默认,下一步 ...

  2. 狂神redis学习笔记

    一.Nosql概述 为什么使用Nosql 1.单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用.随着用户增多,网站出现以下问题 数据量增加到一定程度,单机数据库就放不下了 ...

  3. C#委托的进一步学习

    一.委托的说明 namespace LearningCsharp { class Program { //定义一个委托,使用delegate加上方法签名 //将委托理解为存储方法的"数组&q ...

  4. Educational Codeforces Round 43

    Educational Codeforces Round 43  A. Minimum Binary Number 显然可以把所有\(1\)合并成一个 注意没有\(1\)的情况 view code / ...

  5. 【noi 2.6_9270】&【poj 2440】DNA(DP)

    题意:问长度为L的所有01串中,有多少个不包含"101"和"111"的串. 解法:f[i][j]表示长度为i的01串中,结尾2位的十进制数是j的合法串的个数.那 ...

  6. poj1821 Fence(dp,单调队列优化)

    题意: 由k(1 <= K <= 100)个工人组成的团队应油漆围墙,其中包含N(1 <= N <= 16 000)个从左到右从1到N编号的木板.每个工人i(1 <= i ...

  7. 洛谷 P1525 关押罪犯 (贪心,扩展域并查集)

    题意:有\(n\)个罪犯,\(m\)对罪犯之间有仇,现在将这些罪犯分到两个监狱里去,问两个监狱里有仇罪犯之间的最大权值最小为多少. 题解:先按边权从大到小排序,然后贪心,边权大的两个罪犯,我们一定要先 ...

  8. pyhook的简单使用

    实验内容: 通过python编程调用windows的api,编写键盘和鼠标监控的hook,将相关信息保存记录到txt文档中. 实验步骤: 1.Hook技术,pyHook3和pywin32简介 1.1  ...

  9. 23. 合并K个排序链表 分治

    这种k个相同的子问题,可以两两分治,总的运算次数为logk 关键部分 int dis=1; int len=lists.size(); while(dis<=len) { for(int i=0 ...

  10. Leetcode(2)-两数相加(包含链表操作的注意事项)

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...