Guavaに近づく(二):関数式プログラミング
3985 ワード
関数プログラミング:
Functionインタフェース(jdk 8に既に存在する):
Functionsクラスの使用: Functions.forMap()メソッド: (keyは州の番号)オブジェクトでkeyを検索したい場合は、次のことができます. Functions.compose()メソッド
Functionを組み合わせて、ある州の都市のリストを検索することができます.
Predicateインタフェースを使用します(jdk 8に既に存在します): Predicateインタフェース
Predicatesクラスを使用するには、次の手順に従います.
フィルタ条件は2つあります.
フィルタリングの組み合わせなどは、次の方法で実現できます.
Supplierインタフェースを使用するには: Supplierインタフェース
Suppliersクラスの使用: Suppliers.memorize()メソッド: Suppliers.memorizeWithExpiration()メソッド:
指摘を惜しまない.
Functionインタフェース(jdk 8に既に存在する):
/**
*
*/
public interface Function<F, T> {
T apply(@Nullable F input);
}
例えば簡単な日付変換:/**
*
*/
public class DateFormatFunction implements Function<Date, String> {
@Override
public String apply(Date input) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
return dateFormat.format(input);
}
}
Functionsクラスの使用:
/**
*
*/
public class State {
private String name;
private String code;
private Set<City> mainCities = new HashSet<City>();
}
MapMap<String, State> states = new HashMap<String, State>();
Function<String, State> lookup = Functions.forMap(states);
System.out.println(lookup.apply(key));//key
// key
Function<String, State> lookup = Functions.forMap(states, null);
/** **/
public class City {
private String name;
private String zipCode;
private int population;
@Override
public String toString() {
return name;
}
}
/**
*
*/
public class StateToCityString implements Function<State, String> {
@Override
public String apply(State input) {
return Joiner.on(",").join(input.getMainCities());
}
}
Functionを組み合わせて、ある州の都市のリストを検索することができます.
Function<String, State> lookup = Functions.forMap(states);
Function<State, String> stateFunction = new StateToCityString(); //
Function<String, String> stateCitiesFunction = Functions.compose(stateFunction, lookup); // Function
System.out.println(stateCitiesFunction.apply(key));
は、stateFunction.apply(lookup.apply(key));
Predicateインタフェースを使用します(jdk 8に既に存在します):
public interface Predicate<T> {
boolean apply(T input); // Function.apply, apply
}
は次のとおりです./**
* 500000
*/
public class PopulationPredicate implements Predicate<City> {
@Override
public boolean apply(City input) {
return input.getPopulation() <= 500000;
}
}
Predicatesクラスを使用するには、次の手順に従います.
フィルタ条件は2つあります.
/**
* TEMPERATE
*/
public class TemperateClimatePredicate implements Predicate<City> {
@Override
public boolean apply(City input) {
return input.getClimate().equals(Climate.TEMPERATE);
}
}
/**
* 45.7
*/
public class LowRainfallPredicate implements Predicate<City> {
@Override
public boolean apply(City input) {
return input.getAverageRainfall() < 45.7;
}
}
フィルタリングの組み合わせなどは、次の方法で実現できます.
Predicates.and(smallPopulationPredicate,lowRainFallPredicate);//
Predicates.or(smallPopulationPredicate,temperateClimatePredicate);//
Predicate.not(smallPopulationPredicate);//
Predicates.compose(smallPopulationPredicate,lookup);//
Supplierインタフェースを使用するには:
public interface Supplier<T> {
T get(); //
}
Suppliersクラスの使用:
SupplyCity sc = new SupplyCity();
System.out.println(Suppliers.memoize(sc).get());
System.out.println(Suppliers.memoize(sc).get());// ,
SupplyCity sc = new SupplyCity(); // ,
Supplier<City> supplier = Suppliers.memoizeWithExpiration(sc, 5, TimeUnit.SECONDS);
City c = supplier.get();
System.out.println(c);
Thread.sleep(3000);
c = supplier.get();
System.out.println(c); //
Thread.sleep(2000);
c = supplier.get();
System.out.println(c); //
Guava関数式プログラミングの基礎は、後の集合処理では、より強力に表現されます.指摘を惜しまない.