04. 使用java8的Lambda让代码更优雅

之前面试有面试官问:你说说java8都有些什么新特性,我居然蒙了!
使用java8的Lambda让代码更优雅

1. 参数 -> 方法体

使用方式:实现只有一个抽象方法的接口时会自行匹配到该方法,在箭头左侧编写对应参数个数的参数名,箭头右侧编写方法的实现代码(代码实现为单行时可去掉大括号{})

//a、无参数:
    () -> System.out.println("这是一个例子");

//b、一个参数:
    i -> i+1;

//c、多个参数
    (x, y) -> {  return x + y}

@Test
     public void test() {
         //输入一个数,与100比较大小
         //实现方式1 匿名内部类:
         Comparable<Integer> comparable1 = new Comparable<Integer>() {
             @Override
             public int compareTo(Integer o) {
                 return Integer.compare(o, 100);
             }
         };
         comparable1.compareTo(2);
         //实现方式2 Lambda表达式:实现只有一个抽象方法的Comparable接口时会自行匹配到compareTo方法,在箭头左侧编写对应参数个数的参数名,箭头右侧编写方法的实现代码
         Comparable<Integer> comparable2 = (x) -> Integer.compare(x, 100);
         comparable2.compareTo(2);
     }

二、四大核心函数式接口

Lambda表达式的函数式编程需要函数式接口(有且只有一个抽象方法的接口)的支持,为了防止使用Lambda表达式时都必须手动添加接口,Java8内置了四大核心函数式接口:

Consumer消费型接口void acept(T t);
Supplier供给型接口T get();
Function<T,R>函数型接口R apply(T t);
Predicate断言型接口boolean test(T t);
public static void main(String[] args) {
    //内置函数式接口使用示例

    //消费型接口Consumer,输入一个参数,对其进行打印输出
    Consumer<String> consumer = (x) -> System.out.println(x);
    //打印字符串
    consumer.accept("hehe");


    //供给型接口Supplier,返回指定字符串
    Supplier<String> supplier = () -> "Hello world!";
    //获取字符串
    supplier.get();


    //函数型接口Function,输入字符串,返回字符串长度
    Function<String, Integer> function = (x) -> x.length();
    //获取字符串长度
    function.apply("Hello world!");


    //断言型接口Predicate,输入数字,判断是否大于0
    Predicate<Integer> predicate = (x) -> x > 0;
    //获取判断结果
    predicate.test(10);
}

三、::的使用

某些情况下要实现的业务部分已有方法实现,可直接引用该方法,此时可使用Lambda表达式中的方法引用:

对象::实例方法名
类::静态方法名
类::实例方法名

方法引用注意点:被引用的方法的参数和返回值必须和要实现的抽象方法的参数和返回值一致

//引用out对象的打印输出方法作为Consumer接口accept方法的具体实现
Consumer<String> consumer1 = System.out::println;
consumer1.accept("hehe");


//lambda表达式常用方式
BiPredicate<String, String> bp1 = (x, y) -> x.equals(y);
//方法引用:类::实例方法(方法传入参数是两个参数,且第一个参数作为方法调用对象,第二个参数作为调用的方法的参数)
BiPredicate<String, String> bp2 = String::equals;

四、构造器引用

通过函数式接口实例化类时可进行构造器引用
注意点:引用到的是与函数式接口中的方法参数个数及类型相同的构造器

//lambda表达式常用方式
Supplier<Passenger> supplier1 = () -> new Passenger();
//构造器引用:通过类型推断,引用无参构造器
Supplier<Passenger> supplier2 = Passenger::new;
  
//lambda表达式常用方式
BiFunction<String, String, Passenger> function1 = (x, y) -> new Passenger(x, y);
//构造器引用:通过类型推断,引用有两个String参数的构造器
BiFunction<String, String, Passenger> function2 = Passenger::new;

五、数组引用:

//lambda表达式常用方式
Function<Integer, String[]> fun1 = (x) -> new String[x];
String[] strs1 = fun1.apply(10);
//数组引用
Function<Integer, String[]> fun2 = String[]::new;
String[] strs2 = fun2.apply(10);

六、常用总结

map遍历

map.forEach((k,v)->{ 
    System.out.println("Item : " + k + " Count : " + v); 
});

list遍历

list.forEach(item->{
    System.out.println(item);
});

list.forEach(System.out::println)




hi~我是Mirror,一个为了自由安逸的未来而不断前进的的程序员。
如果你觉得文章对你有一点点帮助,一个小小赞,便是对我的认可,如果有不足之处,也欢迎各位指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值