Java8的lambda无介绍快使用
问题背景
java8之前方法只能存在于对象中,现在可以使用lambda表达式解决这个问题,可以减少代码量,提高效率,增加可读性
lambda的使用
1 先了解几个特点
- lambda表达式是一个匿名的函数,方法可以当做参数一样进行传递
- lambda表达式通常使用 (argument) -> {body},也就是(参数)->(函数体)
- 无参数,无返回值,lambda 体中只有一行代码时,{}可以忽略:( ) -> System.out.println ( “Hello World” );
- 无参数,有返回值:() -> { return 3.1415 };
- 有参数,无返回值:(String s) -> { System.out.println(s); }
- 有一个参数,无返回值:s -> { System.out.println(s); }
- 有多个参数,有返回值:(int a, int b) -> { return a + b; }
- 有多个参数,表达式参数类型可以不写,jvm 可以根据上下文进行类型推断:(a, b) -> { return a – b; }
- lambda表达式可以具有零个,一个或多个参数
- 可以显示声明参数的类型,也可以由编译器自动从上下文推断参数的类型。Lambda表达式会帮助我们推断出这个参数的类型。例如(int a,int b)就可以写成(a,b)
- 参数用小括号括起来,用逗号分隔。例如 (a, b) 、 (int a, int b) 或 (String a, int b, float c)构成
- 空括号用于表示一组空的参数。例如 () -> 42。
- 当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。例如 a -> return a*a
- Lambda 表达式的正文可以包含零条,一条或多条语句。
- 如果 Lambda 表达式的正文只有一条语句,则大括号可不用写,且表达式 的返回值类型要与匿名函数的返回类型相同
- 如果 Lambda 表达式的正文有一条以上的语句必须包含在大括号{}(代码块) 中,且表达式的返回值类型要与匿名函数的返回类型相同
- Lambda表达式中的正文实现的接口中只能有一个抽象方法。(因为它省略的匿名内部类中的方法名)
- Lambda中的核心思想就是将接口中的函数当做参数一样进行传递。(在使用Lambda的时候有要求到这个接口中的抽象方法只有一个)
2 lambda示例
import org.junit.Test;
import java.util.Comparator;
/**
* Lambda表达式的使用举例
*/
public class LambdaTest {
@Test
public void test(){
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("长安欢迎您");
}
};
r1.run();
//lambda表达式
Runnable r2 = () -> System.out.println("长安欢迎您");
r2.run();
}
@Test
public void test2(){
Comparator<Integer> c1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
int compare1 = c1.compare(8,16);
System.out.println(compare1);
//Lambda表达式的写法
Comparator<Integer> c2 = (o1,o2) -> Integer.compare(o1,o2);
int compare2 = c2.compare(28,35);
System.out.println(compare2);
//方法引用
Comparator<Integer> c3 = Integer :: compare;
int compare3 = c3.compare(28,35);
System.out.println(compare3);
}
}
import org.junit.Test;
import java.util.Comparator;
import java.util.function.Consumer;
/**
* Lambda表达式的使用
*
* 1.举例: (o1,o2) -> Integer.compare(o1,o2);
* 2.格式:
* -> :lambda操作符 或 箭头操作符
* ->左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表)
* ->右边:lambda体 (其实就是重写的抽象方法的方法体)
*
* 3.Lambda表达式的使用:(分为6种情况介绍)
*
* 总结:
* ->左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个参数,其一对()也可以省略
* ->右边:lambda体应该使用一对{}包裹;如果lambda体只有一条执行语句(可能是return语句),省略这一对{}和return关键字
*/
public class LambdaTest1 {
//语法格式四:Lambda若只需要一个参数时,参数的小括号可以省略
@Test
public void test5(){
Consumer<String> c1 = (s) -> {
System.out.println(s);
};
c1.accept("先天人性无善恶,后天人性有善恶。");
Consumer<String> c2 = s -> {
System.out.println(s);
};
c2.accept("如果没有邪恶的话我们怎么会知道人世间的那些善良呢?");
}
//语法格式五:Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值
@Test
public void test6(){
Comparator<Integer> c1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};
System.out.println(c1.compare(15,23));
System.out.println("\\\\\\\\\\\\\\\\\\\\\\\\\\");
Comparator<Integer> com2 = (o1,o2) -> {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
System.out.println(com2.compare(16,8));
}
//语法格式六:当Lambda体只有一条语句时,return与大括号若有,都可以省略
@Test
public void test7(){
Comparator<Integer> c1 = (o1,o2) -> {
return o1.compareTo(o2);
};
System.out.println(c1.compare(16,8));
Comparator<Integer> c2 = (o1,o2) -> o1.compareTo(o2);
System.out.println(c2.compare(17,24));
}
@Test
public void test8(){
Consumer<String> c1 = s -> {
System.out.println(s);
};
c1.accept("先天人性无善恶,后天人性有善恶。");
Consumer<String> c2 = s -> System.out.println(s);
c2.accept("如果没有邪恶的话我们怎么会知道人世间的那些善良呢?");
}
}
3 方法引用与构造器引用
- 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
- 方法引用看做是Lambda表达式深层次的表达。方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
- 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!
- 格式:使用操作符 “::” 将类(或对象) 与方法名分隔开来。
如下三种主要使用情况:
对象::实例方法名
类::静态方法名
类::实例方法名
总结
作为程序员第 164 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha …
Lyric: 印地安老斑鸠 平常话不多
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/110711.html