美文网首页程序员@IT·互联网
[Java8]使用JAVA8 Lambda Expression

[Java8]使用JAVA8 Lambda Expression

作者: 骊骅 | 来源:发表于2017-04-13 23:45 被阅读127次

    0x01 什么是Monads

    简单说,Monad就是一种设计模式,表示将一个运算过程,通过函数拆解成互相连接的多个步骤。你只要提供下一步运算所需的函数,整个运算就会自动进行下去。
    下面这两篇文章通过图解的方式讲解了什么是Monads

    0x02 为什么要使用Monads?

    一段不优雅的例子

    编程时检查参数是否为null是最常见的功能。以下面的代码为例子:

    public static class Userdetails{
        public Address address;
        public Name name;
        
    }
    
    public static class Name{
        public String firstName;
        public String lastName;        
    }
    
    public static class Address{
        public String houseNumber;
        public Street street;
        public City city;
        
    }
    
    public static class Street{
        public String name;        
    }
    
    public static class City{
        public String name;        
    }
    

    现在我想获得user.address.street.name,常见代码如下:

     if(user == null )
        return null;
    else if(user.address == null)
        return null;
    else if(user.address.street == null)
        return null;
    else
        return user.address.street.name;
    

    这段检测代码淹没了真正取值的代码,阅读性非常不优雅

    使用Monads来实现的例子

    为了使用Lambda表达式,先定义一个函数接口: SingleArgExpression

    package function;
    
    /**
     * Created by haicheng.lhc on 13/04/2017.
     *
     * @author haicheng.lhc
     * @date 2017/04/13
     */
    @FunctionalInterface
    public interface SingleArgExpression<P, R> {
    
        public R function(P param);
    }
    
    

    然后创建一个类:Option

    package function;
    
    import java.lang.reflect.ParameterizedType;
    
    /**
     * Created by haicheng.lhc on 13/04/2017.
     *
     * @author haicheng.lhc
     * @date 2017/04/13
     */
    public class Option<T> {
    
        T value;
    
        public Option(T value) {
            this.value = value;
        }
    
    
        public <E> Option<E> flatMap(SingleArgExpression<T, Option<E>> mapper) {
            if (value == null) {
                return new Option<E>(null);
            }
            return mapper.function(value);
    
        }
    
    
        @Override
        public boolean equals(Object rhs) {
            if (rhs instanceof Option) {
                Option o = (Option) rhs;
                if (value == null) {
                    return (o.value == null);
                } else {
                    return value.equals(o.value);
                }
            } else {
                return false;
            }
    
        }
    
        @Override
        public int hashCode() {
            return value == null ? 0 : value.hashCode();
        }
    
        public T get() {
            System.out.println("hello");
            return value;
        }
    }
    
    
    

    接下来创建我们的测试类:OptionExample

    package function;
    
    /**
     * Created by haicheng.lhc on 13/04/2017.
     *
     * @author haicheng.lhc
     * @date 2017/04/13
     */
    public class OptionExample {
    
        public static class Userdetails {
    
            public Option<Address> address = new Option<>(null);
            public Option<Name> name = new Option<>(null);
    
        }
    
    
        public static class Name {
            public Option<String> firstName = new Option<String>(null);
            public Option<String> lastName = new Option<String>(null);
        }
    
    
        public static class Address {
            public Option<String> houseNumber;
            public Option<Street> street;
            public Option<City> city;
    
        }
    
    
        public static class Street {
            public Option<String> name = new Option<>("alibaba");
        }
    
    
        public static class City {
            public Option<String> name;
        }
    
        public static void main(String[] args) {
    
            Option<Userdetails> userOpt = new Option<Userdetails>(new Userdetails());
    
            //And look how simple it is now
            String streetName = userOpt.flatMap(user -> user.address)
                .flatMap(address1 -> address1.street)
                .flatMap(street -> street.name)
                .get();
            System.out.println(streetName);
    
        }
    }
    

    可以看出,通过这个方法获取user.address.street.name的时候,代码是非常简洁易懂的。

    思路解析:
    create a class Option that represents an optional value. And lets then have a map method that will run a lambda on its wrapped value and return another option. If the wrapped value is null, it will return an Option containing null without processing the lambda, thus avaoiding a null pointer exception

    0x03 参考文章

    https://www.javacodegeeks.com/2014/03/functional-programming-with-java-8-lambda-expressions-monads.html

    相关文章

      网友评论

        本文标题:[Java8]使用JAVA8 Lambda Expression

        本文链接:https://www.haomeiwen.com/subject/lsriattx.html