四大核心函数式通达信 接口过期,接口
上一篇文章中说到了Lambda表达式中的基本语法,以及我们如何自定义函数式通达信 接口过期,接口。但是在写代码的过程中,大家可能会发现一个问题:当我们有一个新的需求时,可以去自定义一个函数式接口,然后再创建一个它的实现类定义一些相关的业务逻辑行为。那么如果说我们有很多需求、这些需求可能还会不断地变化,那么我们岂不是每次都要去创建新的实现类、同时再去修改之前创建好的实现类中的业务代码?这可太麻烦了吧。。。所以呢,Java8就为我们提供了四大核心函数式接口,使用起来非常的方便。
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);
}
}
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;
}
}
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;
import java.util.function.Predicate;
import java.util.function.Supplier;
/*
*
*/
public class MyTest3 {
//Function : 函数型接口
@Test
public void test3() {
String trimStr = strHandler(' 张起灵-小哥 ', (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);
}
}
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;
}
}
除此之外,还有一些其他的函数式接口,它们有一部分是上面提到的四大核心函数式接口的子接口。
方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!方法引用:使用操作符“::”将方法名和对象或类的名字分隔开来。如下三种主要使用情况:对象::实例方法类::静态方法类::实例方法可以将方法引用理解为Lambda表达式的另外一种表现形式,方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
对象::实例方法
@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;
}
}
类::静态方法
@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));
}
类::实例方法
若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'));
}
构造器引用
格式: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);
}
数组引用
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点