@Test
public void Test_Lambda(){
/**
* 创建一个线程,以前的写法
*/
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("这是匿名内不类的写法");
}
};
// 调用方法r1
r1.run();
/**
*
* 这是lambda 表达式的写法
*/
Runnable r2 = () -> System.out.println("这是lambda 表达式的写法");
//调用r2
r2.run();
}
//这是Lambda表达式
() -> System.out.println("这是lamdba 表达式的写法");
// "->" lambda 操作符
可以把表达式看成俩部分
- 左边 : () 方法参数 Runnable 的run 方法是没有参数的,所以括号里不用填参,
- 右边 : 操作体,也就是需要执行的语句,
Consumer<String> c = (t) -> System.out.println(t.replace("z",""));
//从表达试我们可以看出,我们定义的参数类型是String类型的参数,
// 我们把表达式分为左右俩边,以 "->"号来划分
左边:
(t) 其实相当于形参,我们定义的参数是String类型的,所以 t也是String类型的参数, 相当是(String t),
右边: System.out.println(t.replace("z",""));
因为有了String 类型的形参,所以我们可以在方法体(操作体里面使用),可以使用String类的API
补充 :如果方法只有一个参数,那么括号可以不写,下面这样写也是可以的,
Consumer c = t -> System.out.println(t.replace(“z”,""));
@Test
public void Test_Lambda03(){
Comparator<Integer> c = (x,y) -> {
System.out.println("这是一个比较大小的接口");
return Integer.compare(x,y);
};
int compare = c.compare(7, 6);
System.out.println(compare);
}
Comparator<Integer> c = (x,y) -> Integer.compare(x,y);
@Test
public void Test_Lambda04(){
Comparator<Integer> c = (x,y) -> Integer.compare(x,y);
int compare = c.compare(7, 6);
System.out.println(compare);
}
@Test
public void Test_Lambda05(){
// 这里参数也是没有类型的,jvm也是从上下文获取参数类型的
String[] arr = {"aaa","bbb","ccc"};
}
@Test
public void Test_Lambda06(){
//在jdk1.8以前,这样写是通过不了编译的,但是在jdk1.8以后,完全没问题!因为它通过执行方法的目标方法获取了上下文的类型,
Test_07(new HashMap<>());
}
public void Test_07(Map<String,String> map){
System.out.println(map);
}
/**
* 消费演示
*/
@Test
public void Test_01(){
happy(1000.0,(m) -> System.out.println("爱怎么消费怎么消费Money="+(m-100)));
}
public void happy(Double money, Consumer<Double> consumer){
consumer.accept(money);
}
/**
* 需求 : 创建指定个数的整数,返回list的集合
*/
@Test
public void Test_02(){
List<Integer> list = happy_02(10, () -> (int)(Math.random() * 100));
System.out.println("list="+list);
}
public List<Integer> happy_02(int count, Supplier<Integer> sup){
ArrayList<Integer> lists = new ArrayList<>();
for (int i = 0; i < count; i++) {
int e = sup.get();
lists.add(e);
}
return lists;
}
/**
* 需求,写一个专门处理字符串的方法
*/
@Test
public void Test_03(){
String str = happy_04("我大黑马威武", (s) -> s.substring(1));
System.out.println("str="+str);
}
public String happy_04(String str , Function<String,String> fun){
return fun.apply(str);
}
/*
需求 :将满足条件的字符串放入集合中,
*/
@Test
public void Test04(){
List<String> list = Arrays.asList("zsss", "lsss", "ww", "zl", "tq", "jjj");
ArrayList<String> s1 = happy_05(list,(m) -> m.length() > 2);
System.out.println("list="+s1);
}
public ArrayList<String> happy_05(List<String> list,Predicate<String> predicate){
ArrayList<String> list2 = new ArrayList<String>();
for (String s : list) {
if(predicate.test(s)){
list2.add(s);
}
}
return list2;
}
Lambda有参无返2.png (193.25 KB, 下载次数: 24)
LamdbaDemo1.png (134.18 KB, 下载次数: 20)
爱吃鱼的虾 发表于 2017-11-28 17:43
1. java8 引入了landba 表达式跟 stream 是 java8更新的核心,本章我们主要讲landba
lambda 功能语法介绍
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |