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. PHP-mysql存储照片的两种方式

    PHP-mysql存储照片的两种方式 方式一:把图片数据存储在数据库中(二进制) 数据库代码: CREATE TABLE `photo` (    `id` int(10) unsigned NOT ...

  2. 遇到的一个bug

    /// <summary> /// 检测玩家是否在机器人的球形碰撞体内,这个碰撞体是机器人的侦测范围,玩家在内部会进行视野检测和声音检测 /// </summary> priv ...

  3. WPF 之 MultiBinding(多路 Binding)(四)

    一.前言 ​ 有时候 UI 需要显示的信息由不止一个数据来源决定,这时候就需要使用 MultiBinding ,即多路 Binding. ​ MultiBinding 与 Binding 一样均以 B ...

  4. UDP发送文件

    接收端 package com.zy.demo2; import java.io.File; import java.io.FileOutputStream; import java.net.Data ...

  5. Eclipse配置MySQL连接工具

    1.项目名称右键新建文件夹lib 2.用鼠标将mysql-connector-java-5.1.15-bin.jar移动到lib文件夹中 3.选择Copy files点击OK 4.右键移动过来的mys ...

  6. CF Hello2020 D. New Year and Conference

    D. New Year and Conference 题意 有\(2n\)个区间,分别为\([sa_1,ea_1],[sb_1,eb_1],[sa_2,ea_2],[sb_2,eb_2],\cdots ...

  7. Codeforces 1364C - Ehab and Prefix MEXs

    题意:给1e5的数组a 保证 ai <= ai+1  ai<=i  求一个一样长的数组b 使得mex(b1,b2···bi) = ai QAQ:不知道为啥这1600分的题比赛时出不了 啊啊 ...

  8. AtCoder Beginner Contest 176 E - Bomber (思维)

    题意:有一张\(H\)x\(W\)的图,给你\(M\)个目标的位置,你可以在图中放置一枚炸弹,炸弹可以摧毁所在的那一行和一列,问最多可以摧毁多少目标. 题解:首先我们记录某一行和某一列目标最多的数目, ...

  9. Strategic game POJ - 1463 树型dp

    //题意:就是你需要派最少的士兵来巡查每一条边.相当于求最少点覆盖,用最少的点将所有边都覆盖掉//题解://因为这是一棵树,所以对于每一条边的两个端点,肯定要至少有一个点需要放入士兵,那么对于x-&g ...

  10. HttpClient客户端网络编程——高可用、高并发

    本文是HttpClient的学习博客,RestTemplate是基于HttpClient的封装,feign可基于HttpClient进行网络通信. 那么作为较底层的客户端网络编程框架,该怎么配置使其能 ...