Lambda表达式
- 函数式编程
Lambda 表达式,也可称为闭包,允许把函数作为一个参数,使代码更简洁。
- Lambda格式
参数列表 -> 表达式
参数列表 -> {表达式集合}
- s -> s.length(),s为String类型:返回给定字符串的长度,如果s = “String”,则最终结果为6
- ()->5:始终返回5的无参方法
- (int x, int y)-> {int z = x * y; return z + x;}
//用花括号括起来的表达式集合,要显示添加return。
- 函数式接口
仅含有一个抽象方法的接口
jdk自带的函数式接口
jdk 为 lambda 表达式已经内置了丰富的函数式接口
- Predicate
利用我们在外部设定的条件对于传入的参数进行校验并返回验证通过与否。
public class ConsumerDemo {
public <T> void forEach(List<T> list, Consumer<T> consumer) {
for (T value: list) {
consumer.accept(value);
}
}
}
public static void main(String[] args) {
ConsumerDemo consumerDemo = new ConsumerDemo();
List<String> listStr = new ArrayList<>();
listStr.addAll(Arrays.asList("I", " ", "Learn", " ", "Java8", " ", "Hard"));
consumerDemo.forEach(listStr, (value) -> System.out.println(value.toLowerCase()));
//listStr = consumerDemo.forEach1(listStr, (value) -> value.toLowerCase());
System.out.println(listStr);
}
// 输出
//i
//learn
//java8
//hard
//listStr: [I, , Learn, , Java8, , Hard]
上面的例子遍历字符串集合并以小写形式打印输出
- Consumer
Consumer 提供了一个 accept 抽象函数,该函数接收参数并依据传递的行为应用在传递的参数值。但是不会改变原来参数。
public class ConsumerDemo {
public <T> void forEach(List<T> list, Consumer<T> consumer) {
for (T value: list) {
consumer.accept(value);
}
}
}
public static void main(String[] args) {
ConsumerDemo consumerDemo = new ConsumerDemo();
List<String> listStr = new ArrayList<>();
listStr.addAll(Arrays.asList("I", " ", "Learn", " ", "Java8", " ", "Hard"));
consumerDemo.forEach(listStr, (value) -> System.out.println(value.toLowerCase()));
//listStr = consumerDemo.forEach1(listStr, (value) -> value.toLowerCase());
System.out.println(listStr);
}
// 输出
//i
//learn
//java8
//hard
//listStr: [I, , Learn, , Java8, , Hard]
- Function<T, R>
Funcation 执行转换操作,输入类型 T 的数据,返回 R 类型的结果
public class FuncationDemo {
public List<Integer> pares(List<String> list, Function<String, Integer> function) {
List<Integer> list1 = new ArrayList<>();
for (String s: list) {
list1.add(function.apply(s));
}
return list1;
}
}
public static void main(String[] args) {
FuncationDemo funcationDemo = new FuncationDemo();
List<String> list1 = new ArrayList<>();
list1.addAll(Arrays.asList("1","2","3","4","5","6","7","8","9"));
List<Integer> result = funcationDemo.pares(list1, value -> Integer.valueOf(value));
System.out.println(result);
}
// 输出
//[1, 2, 3, 4, 5, 6, 7, 8, 9]
- 缺点
- 可读性太差,代码越长越差(事物都有两面性,既是优点也是缺点);
- 难调试,没办法将代码运行中出现的问题输出到日志等; 有条件限制,需要升级到jdk1.8才能使用