你眼中java8新特性的样子
文章目录
1. 函数式接口
1. 定义
如果一个接口有且只有一个抽象方法,那么该接口接口一个函数式接口
如果在接口上声明FunctionalInterfance,那么就会将按照函数式接口来要求该接口
如果一个接口有且只有一个抽象方法,但是并没有声明FunctionalInterfance 注解,那么编译器依旧会将该接口看作sshi函数式接口
2. Lambda
1. 作用
1. Lamdba 表达式为java添加了缺失的函数式编程特性,是我们能将函数当作一等公民看待
2. 在将函数作为作为一等公民的语言中,Lamdba表达式的类型是函数。但在Java中,Lambda是对象,他们必须依附于一类特别的对象类型-函数式接口(functional interfance)
2. 概要
Java Lamdba表达式是一种匿名函数;它是没有声明的方法,即没有访问修饰符、返回值和名字
3. 作用
传递行为,不仅仅是值
提升抽象层次
API重用性更好
更加灵活
4. 基本语法
-
(arguments)-> {body}
-
demo
(arg1,arg2) -> {body}
(type1 arg1, type2 arg2) -> {body}
-
实例
- (int a,int b) -> {return a+b;}
- () -> {System.out.pringln(“1111”);}
- (String s) -> {System.out.pringln(s);}
- () -> 111
- ()
-
说明
1.一个参数可以省略小括号,一个公式可以省略花括号
2.类型可以推导,可以省略类型声明
3. function
package com.maidou.learning.java8.function;
import java.util.function.BiFunction;
import java.util.function.Function;
public class FunctionTest1 {
public static void main(String[] args) {
FunctionTest1 functionTest1 = new FunctionTest1();
System.out.println(functionTest1.computer(2, value -> value + 2, value -> value * value));
System.out.println(functionTest1.andThen(2, value -> value + 2, value -> value * value));
System.out.println(functionTest1.computer(2,3 , (value1, value2) -> value1 + value2));
System.out.println(functionTest1.andThen(2,3 , (value1, value2) -> value1 + value2, value -> value * value));
}
/**
* @Author maicheng
* @Description 先应用后作用于当前funcation
* @Date 15:26 2022/10/16
* @Param [a, funcation1, function2]
* @return int
**/
public int computer(int a, Function<Integer, Integer> funcation1, Function<Integer, Integer> function2) {
return funcation1.compose(function2).apply(a);
}
/**
* @Author maicheng
* @Description 先作用于当前funcation后应用
* @Date 15:27 2022/10/16
* @Param [a, funcation1, function2]
* @return int
**/
public int andThen(int a, Function<Integer, Integer> funcation1, Function<Integer, Integer> function2) {
return funcation1.andThen(function2).apply(a);
}
public int computer(int a, int b, BiFunction<Integer, Integer, Integer> biFunction) {
return biFunction.apply(a, b);
}
public int andThen(int a, int b, BiFunction<Integer, Integer, Integer> biFunction, Function<Integer, Integer> function2) {
return biFunction.andThen(function2).apply(a,b);
}
}
4. supplier
1. coding
package com.maidou.learning.java8;
/**
* @Author maichen
* @Description : 学生对象信息
* @Date 23:12 2022/10/16
**/
public class Student {
private String name = "zhangsan";
private int age = 20;
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.maidou.learning.java8;
import java.util.function.Supplier;
public class StudentTest {
public static void main(String[] args) {
// 方案一
Student student = new Student();
System.out.println(student.getName());
// 方案二
Supplier<Student> supplier = () -> new Student();
System.out.println(supplier.get().getName());
// 方案三
Supplier<Student> supplier1 = Student::new;
System.out.println(supplier1.get().getName());
}
}
2. 简介
Supplier是Java8配合Lambda表达式和函数式接口编程组合使用的一个接口,对外表现为 ::
接口Supplier 最适合表示工厂。带有Supplier 的方法,通常应该限制输入工厂的类型参数使用有限制的通配符类型,以便客户端可以传入工厂,来创建制定类型的任意子类。
5. BinaryOperatorTest
1. coding
package com.maidou.learning.java8;
import java.util.Comparator;
import java.util.function.BinaryOperator;
public class BinaryOperatorTest {
public static void main(String[] args) {
BinaryOperatorTest binaryOperatorTest = new BinaryOperatorTest();
System.out.println(binaryOperatorTest.getBinaryOperator(1,2, (a,b) -> a + b));
System.out.println(binaryOperatorTest.getBinaryOperator(1,2, (a,b) -> a - b));
binaryOperatorTest.getMin(1,2, Comparator.comparingInt(a -> a));
}
public int getBinaryOperator(int a, int b, BinaryOperator<Integer> binaryOperator) {
return binaryOperator.apply(a,b);
}
public int getMin(Integer a, Integer b, Comparator<Integer> comparator) {
return BinaryOperator.minBy(comparator).apply(a,b);
}
}
6. Optional
1. coding
package com.maidou.learning.java8;
import java.util.Optional;
public class OptionalTest {
public static void main(String[] args) {
Optional<String> optional = Optional.of("111");
System.out.println(optional.get());
//判空
optional.ifPresent(str -> System.out.println(str));
}
}
7. 方法引用
1. 语义
方法引用实际上是lambda表达式的一种语法糖
可以将方法引用看作是一个函数指针,function pointer
classname::staticmethod
2. 分类
- 类名::静态方法
- 引用名(对象)::实例方法
- 类名::实例方法