[Java 8]JAVA 8 Lambda ExpressionsによるMonads(Functional Programming)の実装
4423 ワード
0 x 01 Monadsとは
簡単に言えば,Monadは1つの演算過程を関数によって互いに接続する複数のステップに分解することを示す設計モードである.次の演算に必要な関数を指定すると、演算全体が自動的に行われます.次の2つの文章では、Monadsとは何かを図解して説明します.記事 文章二 0 x 02 Monadsを使用する理由
優雅でない例
プログラミング時にパラメータがnullであるかどうかをチェックするのが最も一般的な機能です.次のコードを例に挙げます.
この検出コードは真の値を取るコードを水没させ、読解性が非常に優雅ではない.
Monadsを使用して実装された例
Lambda式を使用するには、まず関数インタフェースを定義します:
次にクラスを作成します:
次に、テストクラスを作成します:
この方法で
構想解析: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
簡単に言えば,Monadは1つの演算過程を関数によって互いに接続する複数のステップに分解することを示す設計モードである.次の演算に必要な関数を指定すると、演算全体が自動的に行われます.次の2つの文章では、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