package com.example.lambda;
public interface A {
void show1();
void show2(int i, int j);
}
package com.example.lambda;
/**
* @Author moon
* @Date 2023/4/12 14:33
* @Description TODO
*/
public class B {
public static void main(String[] args) {
method(new A() {
@Override
public void show1() {
System.out.println("匿名内部类show1");
}
@Override
public void show2(int i, int j) {
System.out.println("匿名内部类show2");
System.out.println("i = " + i + ",j = " + j);
}
});
}
public static void method(A a) {
a.show2(1, 2);
}
}
如果接口里面只有一个方法呢?
package com.example.lambda;
public interface A {
void show2(int i, int j);
}
package com.example.lambda;
/**
* @Author moon
* @Date 2023/4/12 14:33
* @Description TODO
*/
public class B {
public static void main(String[] args) {
method(new A() {
@Override
public void show2(int i, int j) {
System.out.println("匿名内部类show2");
System.out.println("i = " + i + ",j = " + j);
}
});
}
public static void method(A a) {
a.show2(1, 2);
}
}
Java方法:
权限修饰符 + 返回值 + 方法签名 + 参数声明 + 方法体
Lambda表达式:
参数声明 + 方法体
package com.example.lambda;
/**
* @Author moon
* @Date 2023/4/12 14:33
* @Description TODO
*/
public class B {
public static void main(String[] args) {
//Java方法
method(new A() {
@Override
public void show2(int i, int j) {
System.out.println("匿名内部类show2");
System.out.println("i = " + i + ",j = " + j);
}
});
//Lambda
method((int i, int j)->{
System.out.println("匿名内部类show2");
System.out.println("i = " + i + ",j = " + j);
});
}
public static void method(A a) {
a.show2(1, 2);
}
}
@FunctionalInterface
检查该接口是不是只有一个抽象方法的。如果是的话,他才不会报错。
就大胆的写Lambda来代替匿名内部类吧!
package com.example.lambda;
/**
* @Author moon
* @Date 2023/4/12 14:33
* @Description TODO
*/
public class B {
public static void main(String[] args) {
//匿名内部类
A aa = new A() {
@Override
public void show2(int i, int j) {
System.out.println("匿名内部类show2");
System.out.println("i = " + i + ",j = " + j);
}
};
//Lambda
A a = (int i, int j)->{
System.out.println("匿名内部类show2");
System.out.println("i = " + i + ",j = " + j);
};
method(aa);
method(a);
}
public static void method(A a) {
a.show2(1, 2);
}
}
Lambda表达式有返回值的写法
package com.example.lambda;
public interface C {
boolean a(Object obj);
}
class D {
C c = new C() {
@Override
public boolean a(Object obj) {
//运算符是双目运算符,
// 左面的操作元是一个对象实例,右面是一个类.
// 当左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false
return (obj instanceof Iterable) && ((Integer) obj < 100);
}
};
C c2 = (Object obj) -> {
return (obj instanceof Iterable) && ((Integer) obj < 100);
};
}
package com.example.lambda;
import java.util.ArrayList;
public interface C {
boolean a(Object obj);
}
class D {
public static void main(String[] args) {
//Lambda
C c = (Object obj) -> {
return ((obj instanceof Integer) && (Integer) obj > 100);
};
//用到了匿名内部类的构造代码块回调
ArrayList<Integer> list = new ArrayList<Integer>(){{
this.add(12);
this.add(103);
this.add(87);
this.add(106);
this.add(348);
this.add(64);
}};
for (Integer integer : list) {
if (c.a(integer)) {
System.out.println("符合规范:\t" + integer);
}
}
}
}
package com.example.lambda;
public interface D1 {
Object mapping(Object obj);
}
class Main{
public static void main(String[] args) {
D1 d = (Object obj) -> {
return obj.toString();
};
D1 d2 = (Object obj) -> {
return ((obj instanceof String) ? obj + "\tis a String" : null);
};
Object mapping = d.mapping(new Main());
System.out.println(mapping);
}
}
package com.example.lambda;
import java.util.ArrayList;
import java.util.HashMap;
public interface D1 {
Object mapping(Object obj);
}
class Main{
public static void main(String[] args) {
D1 d = (Object obj) -> {
return obj.toString();
};
D1 d2 = (Object obj) -> {
return ((obj instanceof String) ? obj + "\tis a String" : null);
};
ArrayList<Object> list = new ArrayList<Object>() {{
this.add(new HashMap());
this.add(new Main());
this.add("asdfgh");
}};
for (Object obj : list) {
System.out.println(d2.mapping(obj));
}
}
}
//1、首先第一种情况:Lambda入参类型简化
package com.example.lambda;
public interface E {
void test(int i, boolean b, String s);
}
class Main1 {
public static void main(String[] args) {
//原始
E e = (int i, boolean b, String s) -> {
System.out.println(".............");
};
//简化
E e1 = (i, b, s) -> {
System.out.println(".............");
};
//可以乱写名字,java会自动匹配
E e2 = (ifwfw, bgthgyt, shyhyw) -> {
System.out.println(".............");
};
}
}
//2、第二种情况,Lambda单入参的简写
package com.example.lambda;
public interface E {
void test(int i);
}
class Main1 {
public static void main(String[] args) {
//原始
E e = (int i) -> {
System.out.println(".............");
};
//简化
E e1 = (i) -> {
System.out.println(".............");
};
//这种写法新手还不熟悉的最好别学,等你Lambda用熟悉了再写这种也可以。否则新手容易记混什么时候要加()什么时候可以不加()。
E e2 = i -> {
System.out.println(".............");
};
}
}
//第三种情况,无返回值单语句简化
package com.example.lambda;
public interface E {
void test(int i);
}
class Main1 {
public static void main(String[] args) {
//原始
E e = (int i) -> {
System.out.println(i);
};
//简化
E e1 = (i) -> System.out.println(i);
//简
E e2 = i -> System.out.println(i);
//最简
E e3 = System.out::println;
}
}
//第四种情况,有返回值单return的简化
package com.example.lambda;
public interface E {
boolean test(int i);
}
class Main1 {
public static void main(String[] args) {
//原始
E e = (int i) -> {
return i < 50;
};
//简
E e2 = i -> i < 50;
}
}
参考知乎作者StevenZhang:JDK8新特性第一篇:Lambda表达式