关注做什么,不关心是怎么实现的。为了实现该思想,java有了一种新的语法格式,Lambda表达式。Lambda本质是匿名内部类对象,是一个函数式接口。函数式接口表示接口内部只有一个抽象方法。使用该语法可以大大简化代码。
public static void main(){
new Thread(new Runnable(){
@Override
public void run(){
System.out.println("线程任务");
}
}).start();
}
new Thread(
() -> System.out.println("线程任务"); ).start();
即Simple Abstract Methods接口,只有一个抽象方法需要重写的接口。可以使用@FunctionalInterface
来验证接口是否是函数式接口。
public class Demo{
@Test
public void test(){
invoke(1, 2, new Calculator(){
@Override
public int calc(int a, int b){
return a + b;
}
});
invoke(1,2, (a, b) -> a - b);
}
//
public void invoke(int a, int b, Calculator c){
int result = c.calc(a, b);
System.out.println(result);
}
}
//函数式接口
public interface Calculator{
public int calc(int a, int b);
}
语法格式:
->
java提供的函数式接口:Consumer接口
@Test
public void test(){
List<String> list = new ArrayList<>();
list.add("tom");
list.add("jack");
list.add("rose");
list.add("jerry");
//forEach()里面的Consumer对象是一个函数式接口
list.forEach(s -> System.out.println(s));
}
@Test
public void test(){
Map<String> map = new HashMap<>();
map.add("tom", 1);
map.add("jack", 2);
map.add("rose", 3);
map.add("jerry", 4);
//forEach()里面的Consumer对象是一个函数式接口
map.forEach((k, v) -> System.out.println(k +"="+v));
}
@Test
public void test(){
Supplier<Double> supper = new Supplier<>(){
public Double get(){
return Math.random();
}
};
//lambda
Supplier<Double> supplier = () -> Math.random();
//----------应用--------------
Stream<Double> stream = stream.generate(
() -> Math.random();
);
}
@Test
public void test(){
List<String> list = new ArrayList<>();
list.add("tom");
list.add("jack");
list.add("rose");
list.add("jerry");
//替换所有元素
//方法内部需要的是一个功能型函数apply()
list.replaceAll(s -> s.toUpperCase());
//forEach()遍历
list.forEach(s -> System.out.println(s));
}
@Test
public void test(){
List<String> list = new ArrayList<>();
list.add("tom");
list.add("jack");
list.add("rose");
list.add("jerry");
list.removeIf(new Predicate<String>(){
public boolean test(String s){
return s.length() > 4;
}
});
//lambda
list.removeIf(s -> s.length() < 4);
//forEach()里面的Consumer对象是一个函数式接口
list.forEach(s -> System.out.println(s));
}
当Lambda符号左右两边的参数一致时,可以简化为类名::方法名
的形式。
当表达式左右两边的参数一致时,可以简化为类名::new
的形式。