千家信息网

如何理解lambda

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要讲解了"如何理解lambda",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解lambda"吧!lambda语法类型为接口,有且只有一
千家信息网最后更新 2025年01月16日如何理解lambda

这篇文章主要讲解了"如何理解lambda",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何理解lambda"吧!

lambda语法

类型为接口,有且只有一个需要实现的方法,就可以使用一个表达式作为该接口的实现

看懂lambda

java lambda有能力表达一个完整的方法签名(带返回值),但在开发中总是写全lambda并不能达到简化代码的效果,因此开发中我们更愿意使用lambda简化后的写法。

package com.karmic.lambda;import java.util.function.Function;import java.util.function.Supplier;/** * @author karmic */public class LambdaDemo {        public static void main(String[] args) {                //lambda完全体                Function f0 = (Function) (String s) -> { return Integer.parseInt(s); };                //只有一行省略 {} 和 return                Function f1 = (Function) (String s) -> Integer.parseInt(s);                //简化返回类型                Function f2 = (String s) -> Integer.parseInt(s);                //简化入参类型                Function f3 = (s) -> Integer.parseInt(s);                //单入参省略入参()                Function f4 = s -> Integer.parseInt(s);                //表达式调用的方法 签名和返回值与接口一致时 使用::简化表达式                Function f5 = Integer::parseInt;                //类::静态方法 或 对象::对象方法 可以转换成签名相同的方法                Supplier a1 = DemoBean::getA;                Supplier a2 = new DemoBean()::getB;                //类::对象方法 可以转换成签名第一个入参为类对象,其余签名一致的接口                Function bf = DemoBean::getB;        }        static class DemoBean {                public static String getA() {                        return "A";                }                public String getB() {                        return "B";                }        }}

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020112110170750.png#pic_center

lambda开发中常见的应用

优雅的绕过NullPointException

package com.karmic.lambda;import java.util.Optional;/** * @author karmic */public class NullExceptionAvoid {        public static void main(String[] args) {                A a = new A(new B(null));                String s = Optional.of(a).map(A::getB).map(B::getC).map(C::getS).orElse(null);                System.out.println(s);        }        static class A {                B b;                public A(B b) {                        this.b = b;                }                public B getB() {                        return b;                }        }        static class B {                C c;                public B(C c) {                        this.c = c;                }                public C getC() {                        return c;                }        }        static class C {                String s;                public C(String s) {                        this.s = s;                }                public String getS() {                        return s;                }        }}

放弃代码执行控制权

                           // Create bean instance.                                if (mbd.isSingleton()) {                                        sharedInstance = getSingleton(beanName, () -> {                                                try {                                                // Spring源码,createBean方法是否执行的控制权,由getSingleton控制 判断bean是否已经创建过,再决定是否调用createBean方法                                                        return createBean(beanName, mbd, args);                                                }                                                catch (BeansException ex) {                                                        // Explicitly remove instance from singleton cache: It might have been put there                                                        // eagerly by the creation process, to allow for circular reference resolution.                                                        // Also remove any beans that received a temporary reference to the bean.                                                        destroySingleton(beanName);                                                        throw ex;                                                }                                        });                                        bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);                                }

MR式数据处理

package com.karmic.lambda;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.function.Function;import java.util.stream.Collectors;/** * @author karmic */public class StreamWordCountDemo {        public static void main(String[] args) {                @SuppressWarnings("serial")                List list = new ArrayList() {                        {                                add("hello world");                                add("hello java");                                add("hello python");                                add("hello kotlin");                        }                };                Map map = list.stream().map(s -> s.split(" "))                                .flatMap(Arrays::stream)                                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));                System.out.println(map);        }}

感谢各位的阅读,以上就是"如何理解lambda"的内容了,经过本文的学习后,相信大家对如何理解lambda这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0