Lambda表达式的语法与如何使用Lambda表达式

时间:2024-09-25 19:36:20

Lambda表达式是对象,是一个函数式接口的实例

如何来写Lambda表达式?

  • 看参数
  • 看返回值


代码实例1:

package day2;

import jdk.nashorn.internal.codegen.CompilerConstants;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.function.Function;
import java.util.function.UnaryOperator; /**
* @auther hhh
* @date 2018/12/27 21:32
* @description
*/
public class LambdaExpress {
/**
* Lambda 表达式语法:
* args -> expr (左边是参数,右边是表达式)
* 或者 (Object...args )->{函数式接口抽象方法的实现逻辑}
* ()里面参数的个数,根据函数式接口里面的抽象方法的参数个数来决定
* 只有一个参数的时候,()可以省略
* 当expr逻辑非常简单的时候,{}和return都可以省略
*/
/**
* 表达式示例:
* () -> {} //无参,无返回值
* () -> {System.out.println(1);} //无参,无返回值
* () -> System.out.println(1)//无参,无返回值,上面的简写,将{}省略
* () -> {return 100;} //无参有返回值
* () -> return 100; // 无参又返回值
* () -> null ; //无参又返回值,返回null
* (int x) -> {return x+1;} //单参,有返回值
* (int x) -> return x+1;
* (x) -> x+1 //单参,又返回值(不指定参数类型,多个参数必须用括号)
* x -> x+1 //单参数,有返回值(不指定参数类型)
*/
/**
* 注意事项:(以下实现是错误的)
* (x,int y) -> x+y (不能部分省略)
* (x,final y) -> x+y (参数不能使用final修饰符)
* Object o = () -> "hello" (不能将Lambda表达式赋值给一个非函数式接口)
* Object obj = (Supplier<?>)() ->"hello" (不需要也不允许使用throws语句来声明他可能会抛出的异常)
*/
public static void main(String[] args) throws Exception {
//语法:LambdaParameters -> LambdaBody (返回值必须是函数式接口)
Runnable r1 = () -> System.out.println("r1");
Runnable r5 = () -> {
System.out.println("r5");
};
//不是用lambda表达式
Runnable r4 = new Runnable() {
@Override
public void run() {
System.out.println("r4");
}
};
r1.run();
r4.run();
Runnable r2 = null;
Runnable r3 = () -> {
}; Callable<String> call1 = new Callable<String>() {
@Override
public String call() throws Exception {
return "不适用lambda";
}
};
Callable<String> call2 = () -> {
return "使用lambda;";
};
Callable<String> call3 = () -> "使用lambda简化,不需要人return与{}";
//call2 中的call方法是在函数式接口中实现的
System.out.println(call1.call() + "===" + call2.call() + "===" + call3.call()); UserMapper userMapper = new UserMapper() {
@Override
public void insert(User user) {
System.out.println(" insert user");
}
};
UserMapper u2 = (User user) -> System.out.println("use lambda insert user");
userMapper.insert(new User());
u2.insert(new User());
OrderMapper orderMapper = new OrderMapper() {
@Override
public int insert(Order order) {
return 1;
}
};
OrderMapper o1 = (Order order) -> 1;
OrderMapper o2 = (order) -> {
return 1;
};
OrderMapper o3 = (Order order) -> {
return 1;
};
//省略参数类型
OrderMapper o4 = (order) -> 1; //Function<T,R> 代表一个输入一个输出,一般输入输出是不同类型
Function<Integer, Integer> f1 = (a) -> {
int sum = 0;
for (int i = 1; i <= a; i++) {
sum += i;
}
return sum;
};
//UnaryOperator<T> 继承自Function<T,R>一般输入输出是同种类型,因为输入输出是同种类型,所以之传了一个参数,省略输出类型
UnaryOperator<Integer> unaryOperator = (a) -> {
int sum = 0;
for (int i = 0; i < a; i++) {
sum += a;
}
return sum;
};
System.out.println("sum = " + f1.apply(10));
System.out.println("sum = " + unaryOperator.apply(10));
//尝试使用for循环进行遍历
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
UnaryOperator<List<Integer>> unaryOperator2 = (l) -> {
for (Integer i : list) {
list.set(i - 1, i + 1);
}
return list;
};
System.out.println(unaryOperator2.apply(list));
}
} interface UserMapper {
void insert(User user);
} class User {
} interface OrderMapper {
int insert(Order order);
} class Order {
}

代码实例2:

package day2;

import javax.sound.midi.Soundbank;

/**
* @auther hhh
* @date 2018/12/27 22:32
* @description
*/
public class LambdaExpre2 {
static int get() {
System.out.println(1);
return 1;
} static void set() {
} static String find() {
return "";
} public static void main(String[] args) throws Exception {
/**
* 方法的返回值不是一定会返回,具体是有函数式接口的抽象方法决定的
* 实现的函数式接口没有返回值,调用的方法的值就不会被返回
* Runnable 中方法的实现为 public abstract void run(); 没有返回值
* 函数式接口只管执行方法,不管没有有返回值
*/
//Runnable 调用自定义的方法不会报错,但是Runnable方法为什么不报错呢?
Runnable r1 = () -> get();
Runnable r2 = () -> set();
// Runnable r3 = () -> 100; 不行,因为在Runnable实现的抽象方法中没有返回值,强制返回报错 r1.run();//无输出,说明值没有被返回 //Fun方法在调用set()的时候会报错,是因为Fun中定义的get()方法需要有返回值,而set()方法没有返回值
Fun f1 = () -> get();
System.out.println(f1.get());
Fun f2 = () -> 100;
Fun f3 = () -> 1 > 5 ? 1 : -1;
Fun f4 = () -> true ? 1 : -1;
// Fun f2 = () -> set();
// Fun f3 = () -> find();返回值类型必须一致
}
} interface Fun {
int get();
}
package day2;

import javax.sound.midi.Soundbank;

/**
* @auther hhh
* @date 2018/12/27 22:32
* @description
*/
public class LambdaExpre2 {
static int get() {
System.out.println(1);
return 1;
} static void set() {
} static String find() {
return "";
} public static void main(String[] args) throws Exception {
/**
* 方法的返回值不是一定会返回,具体是有函数式接口的抽象方法决定的
* 实现的函数式接口没有返回值,调用的方法的值就不会被返回
* Runnable 中方法的实现为 public abstract void run(); 没有返回值
* 函数式接口只管执行方法,不管没有有返回值
*/
//Runnable 调用自定义的方法不会报错,但是Runnable方法为什么不报错呢?
Runnable r1 = () -> get();
Runnable r2 = () -> set();
// Runnable r3 = () -> 100; 不行,因为在Runnable实现的抽象方法中没有返回值,强制返回报错 r1.run();//无输出,说明值没有被返回 //Fun方法在调用set()的时候会报错,是因为Fun中定义的get()方法需要有返回值,而set()方法没有返回值
Fun f1 = () -> get();
System.out.println(f1.get());
Fun f2 = () -> 100;
Fun f3 = () -> 1 > 5 ? 1 : -1;
Fun f4 = () -> true ? 1 : -1;
// Fun f2 = () -> set();
// Fun f3 = () -> find();返回值类型必须一致
}
} interface Fun {
int get();
}

代码实例3:

package day2;

import java.util.function.BiFunction;
import java.util.function.Function; /**
* @auther hhh
* @date 2018/12/27 22:50
* @description
*/
public class BiFuncationTest {
public static void main(String[] args) {
//写任何函数式接口(Lambda)先把格式写好,重点是方法参数与返回值
//BiFunction<T, U, R> b = (参数,因为有两个输入参数,()一定不能省略)->{执行方法,若方法直接返回课省略{}};
//BiFunction 代表两个输入一个输出
BiFunction<String, String, Integer> biFunction = (a, b) -> a.length() + b.length();
System.out.println(biFunction.apply("sadfasdf", "fasdfsdaf"));
BiFunction<Integer, Integer, String> biFunction2 = (a, b) -> {
//编写具体代码逻辑
return "";
};
//输入String,输出Integer
Function<String, Integer> function = a -> a.length();
}
}
package day2;

import java.util.function.BiFunction;
import java.util.function.Function; /**
* @auther hhh
* @date 2018/12/27 22:50
* @description
*/
public class BiFuncationTest {
public static void main(String[] args) {
//写任何函数式接口(Lambda)先把格式写好,重点是方法参数与返回值
//BiFunction<T, U, R> b = (参数,因为有两个输入参数,()一定不能省略)->{执行方法,若方法直接返回课省略{}};
//BiFunction 代表两个输入一个输出
BiFunction<String, String, Integer> biFunction = (a, b) -> a.length() + b.length();
System.out.println(biFunction.apply("sadfasdf", "fasdfsdaf"));
BiFunction<Integer, Integer, String> biFunction2 = (a, b) -> {
//编写具体代码逻辑
return "";
};
//输入String,输出Integer
Function<String, Integer> function = a -> a.length();
}
}