[Java 8]JAVA 8 Lambda ExpressionsによるMonads(Functional Programming)の実装

4423 ワード

0 x 01 Monadsとは
簡単に言えば,Monadは1つの演算過程を関数によって互いに接続する複数のステップに分解することを示す設計モードである.次の演算に必要な関数を指定すると、演算全体が自動的に行われます.次の2つの文章では、Monadsとは何かを図解して説明します.
  • 記事
  • 文章二
  • 0 x 02 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

    { 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 value;
    
        public Option(T value) {
            this.value = value;
        }
    
    
        public  Option flatMap(SingleArgExpression> mapper) {
            if (value == null) {
                return new Option(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 = new Option<>(null); public Option name = new Option<>(null); } public static class Name { public Option firstName = new Option(null); public Option lastName = new Option(null); } public static class Address { public Option houseNumber; public Option street; public Option city; } public static class Street { public Option name = new Option<>("alibaba"); } public static class City { public Option name; } public static void main(String[] args) { Option userOpt = new Option(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
    0 x 03リファレンス
    https://www.javacodegeeks.com/2014/03/functional-programming-with-java-8-lambda-expressions-monads.html