深入浅出理解Java Lambda表达式之四大核心函数式的用法与范例

网友投稿 246 2022-09-15


深入浅出理解Java Lambda表达式之四大核心函数式的用法与范例

目录1.四大核心函数式接口1.1 Consumer : 消费型接口1.2 Supplier : 供给型接口1.3 Function : 函数型接口1.4 Predicate : 断言型接口2.方法引用2.1 对象 :: 实例方法2.2 类 :: 静态方法2.3 类 :: 实例方法3.构造器引用4.数组引用

1.四大核心函数式接口

上一篇文章中说到了Lambda表达式中的基本语法,以及我们如何自定义函数式接口。但是在写代码的过程中,大家可能会发现一个问题:当我们有一个新的需求时,可以去自定义一个函数式接口,然后再创建一个它的实现类定义一些相关的业务逻辑行为。那么如果说我们有很多需求、这些需求可能还会不断地变化,那么我们岂不是每次都要去创建新的实现类、同时再去修改之前创建好的实现类中的业务代码?这可太麻烦了吧。。。

所以呢,Java8就为我们提供了四大核心函数式接口,使用起来非常的方便。

1.1 Consumer : 消费型接口

package com.szh.java8;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.function.Consumer;

import java.util.function.Function;

import java.util.function.Predicate;

import java.util.function.Supplier;

/*

*

*/

public class MyTest3 {

//Consumer : 消费型接口

@Test

public void test1() {

happy(6666.66,(m) -> System.out.println("本地双11共消费 " + m + " 元!!!"));

}

public void happy(double money, Consumer consumer) {

consumer.accept(money);

}

}

1.2 Supplier : 供给型接口

package com.szh.java8;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.function.Consumer;

import java.util.function.Function;

import java.util.function.Predicate;

import java.util.function.Supplier;

/*

*

*/

public class MyTest3 {

//Supplier : 供给型接口

@Test

public void test2() {

List numList = getNumList(10, () -> (int)(Math.random() * 100));

for (Integer num : numList) {

System.out.println(num);

}

}

public List getNumList(int num, Supplier supplier) {

List list = new ArrayList<>();

for (int i = 0; i < num; i++) {

Integer n = supplier.get();

list.add(n);

}

return list;

}

}

1.3 Function : 函数型接口

package com.szh.java8;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.function.Consumer;

import java.util.function.Function;

importzmeOuRqZEE java.util.function.Predicate;

import java.util.function.Supplier;

/*

*

*/

public class MyTest3 {

//Function : 函数型接口

@Test

public void test3() {

String trimStr = strHandler("\t\t\t 张起灵-小哥 ", (str) -> str.trim());

System.out.println(trimStr);

String newStr = strHandler("我喜欢看盗墓笔记呀!!!",(str) -> str.substring(4,8));

System.out.println(newStr);

}

public String strHandler(String str, Function function) {

return function.apply(str);

}

}

1.4 Predicate : 断言型接口

package com.szh.java8;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.function.Consumer;

import java.util.function.Function;

import java.util.function.Predicate;

import java.util.function.Supplier;

/*

*

*/

public class MyTest3 {

//Predicate : 断言型接口

@Test

public void test4() {

List list = Arrays.asList("Hello","张起灵-小哥","HashMap","jdk8","List","Set");

List stringList = filterStr(list, (s) -> s.length() > 5);

for (String string : stringList) {

System.out.println(string);

}

}

public List filterStr(List strings, Predicate predicate) {

List strList = new ArrayList<>();

for (String str : strings) {

if (predicate.test(str)) {

strList.add(str);

}

}

return strList;

}

}

zmeOuRqZEE

除此之外,还有一些其他的函数式接口,它们有一部分是上面提到的四大核心函数式接口的子接口。

2.方法引用

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! 方法引用:使用操作符 “ :: ” 将方法名和对象或类的名字分隔开来。

如下三种主要使用情况 :

对象 :: 实例方法

类 :: 静态方法

类 :: 实例方法

可以将方法引用理解为 Lambda 表达式的另外一种表现形式,方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!

2.1 对象 :: 实例方法

@Test

public void test1() {

Consumer con1 = (str) -> System.out.println(str);

con1.accept("Hello World!!!");

PrintStream ps = System.out;

Consumer con2 = ps::println;

con2.accept("Hello Java8!!!");

Consumer con3 = System.out::println;

con3.accept("Hello Lambda!!!");

}

@Test

public void test2() {

Employee emp = new Employee();

emp.setName("张起灵");

emp.setAge(18);

Supplier extends Object> sup1 = () -> emp.getName();

String str = (String) sup1.get();

System.out.println(str);

Supplier sup2 = emp::getAge;

Integer age = sup2.get();

System.out.println(age);

}

package com.szh.java8;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

/**

*

*/

@Data

@NoArgsConstructor

@AllArgsConstructor

public class Employee {

private Integer id;

private String name;

private Integer age;

private Double salary;

public Employee(Integer id) {

this.id = id;

}

public Employee(Integer id,String name) {

this.id = id;

this.name = name;

}

}

2.2 类 :: 静态方法

@Test

public void test3() {

Comparator com1 = (x,y) -> Integer.compare(x,y);

System.out.println(com1.compare(10, 20));

Comparator com2 = Integer::compare;

System.out.println(com2.compare(300, 110));

}

2.3 类 :: 实例方法

若 Lambda 的参数列表的第一个参数是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName

@Test

public void test4() {

BiPredicate bp1 = (str1,str2) -> str1.equals(str2);

System.out.println(bp1.test("Hello", "hello"));

BiPredicate bp2 = String::equals;

System.out.println(bp2.test("Java", "Java"));

}

3.构造器引用

格式 : ClassName::new

与函数式接口相结合,自动与函数式接口中方法兼容。构造器的参数列表,需要与函数式接口中参数列表保持一致!

代码中Employee类参考上面的案例。

@Test

public void test5() {

//无参构造器

Supplier sup1 = () -> new Employee();

System.out.println(sup1.get());

//无参构造器

Supplier sup2 = Employee::new;

System.out.println(sup2.get());

//一个参数构造器

Function function = Employee::new;

Employee employee = function.apply(1001);

System.out.println(employee);

//两个参数构造器

BiFunction biFunction = Employee::new;

Employee emp = biFunction.apply(1001, "张起灵");

System.out.println(emp);

}

4.数组引用

格式 :类型[] :: new

@Test

public void test6() {

Function fun = (x) -> new String[x];

String[] strings = fun.apply(10);

System.out.println(strings.length);

Function fun2 = String[]::new;

String[] strArray = fun2.apply(50);

System.out.println(strArray.length);

}

以上就是深入浅出理解Java Lambda表达式之四大核心函数式的用法与范例的详细内容,更多关于Java Lambda表达式的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解密静态路由,一文分析静态路由优缺点!(分别谈谈静态路由技术的优点和缺点)
下一篇:配置接口的IPv6地址(lan侧地址配置ipv6)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~