Lambda表达式
- 避免匿名内部类过多
- 代码更简洁
- 函数式接口:有且只有一个函数式接口,即只有一个方法。
测试1
package com.fh.lambda; public class LambdaTest { public static void main(String[] args) { IUserService service = () -> System.out.println("【只有一句话可以去掉{花括号}】");; service.add(); IUserService_Argument service_argument = (int id,String type)->{ int salary = 1; int bonus = 2; System.out.println(id+"====="+type+"=====" + (salary + bonus)); }; service_argument.add(1,"电脑补助"); service_argument = (id,type)->{ int salary = 1; int bonus = 2; System.out.println("【可以去掉参数类型】" + id+"====="+type+"=====" + (salary + bonus)); }; service_argument.add(1,"电脑补助"); } } interface IUserService { void add(); } interface IUserService_Argument { public void add(int id,String type); }
测试2
模拟new Thread(()-> System.out.println("模拟Thread")).start();
/** * 模拟中介租房 */ public class StaticProxy_RentHourse { public static void main(String[] args) { //new LianJiaProxy(new ZukeTarget()).rent(); new LianJiaProxy(()->{ System.out.println("我租到一个性价比比较高的房子"); }).rent(); } } /** * 租房 */ interface Rent{ public void rent(); } /** * 目标:租客 */ class ZukeTarget implements Rent{ @Override public void rent() { System.out.println("我租到一个性价比比较高的房子"); } } /** * 代理:链家 */ class LianJiaProxy implements Rent{ private Rent rent;//真实目标角色 public LianJiaProxy(Rent rent) { this.rent = rent; } @Override public void rent() { nofityLook(); this.rent.rent(); pay(); } private void pay() { System.out.println("付款了"); } private void nofityLook() { System.out.println("链家通知看房"); } }
System.out::print 与 System.out.print的区别
四大函数式接口
函数式接口:有且只有一个方法。
函数型接口
import java.util.function.Function;
/**
* 函数型接口
* @FunctionalInterface
* public interface Function
* R apply(T t);
* }
*/
public class FunctionTest {
public static void main(String[] args) {
/* Function function = new Function() {
@Override
public String apply(String s) {
System.out.println("参数=》"+s);
return "返回值=》123";
}
};
System.out.println(function.apply("ddd"));*/
Function function =(s)->{
System.out.println("参数=》"+s);
return "返回值=》123";
};
System.out.println( function.apply("ddd"));
}
}
断定型接口
import java.util.function.Predicate;
/**
* 断定型接口
* @FunctionalInterface
* public interface Predicate {
* boolean test(T t);
* }
*/
public class PredicateTest {
public static void main(String[] args) {
/*Predicate predicate = new Predicate() {
@Override
public boolean test(String s) {
return s.isEmpty();
}
};
System.out.println(predicate.test("a"));*/
Predicate predicate = (s)->{
return s.isEmpty();
};
System.out.println(predicate.test("a"));
}
}
消费型接口
/** * 消费型接口 * public interface Consumer{ * void accept(T t); * } */ public class ConsumerTest { public static void main(String[] args) { /* Consumer consumer = new Consumer () { @Override public void accept(String s) { System.out.println(s); } }; consumer.accept("abc");*/ Consumer consumer = (s) -> { System.out.println(s); }; consumer.accept("a"); } }
供给型接口
/** * 供给型接口 * @FunctionalInterface * public interface Supplier{ * T get(); * } */ public class SupplierTest { public static void main(String[] args) { /*Supplier supplier = new Supplier () { @Override public String get() { return "abc"; } }; System.out.println(supplier.get());*/ Supplier supplier = ()->{ return "a"; }; System.out.println(supplier.get()); } }