Guavaに近づく(二):関数式プログラミング


関数プログラミング:
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クラスの使用:
  • Functions.forMap()メソッド:
  • /**
     *   
     */
    public class State {
    	private String name;
    	private String code;
    	private Set<City> mainCities = new HashSet<City>();
    }
    Map(keyは州の番号)オブジェクトでkeyを検索したい場合は、次のことができます.
    Map<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);
  • Functions.compose()メソッド
  • /**   **/
    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に既に存在します):
  • Predicateインタフェース
  • 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インタフェースを使用するには:
  • Supplierインタフェース
  • public interface Supplier<T> {
           T get(); //      
    }

    Suppliersクラスの使用:
  • Suppliers.memorize()メソッド:
  • SupplyCity sc = new SupplyCity();
    System.out.println(Suppliers.memoize(sc).get());
    System.out.println(Suppliers.memoize(sc).get());//      ,   
  • Suppliers.memorizeWithExpiration()メソッド:
  • 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関数式プログラミングの基礎は、後の集合処理では、より強力に表現されます.
    指摘を惜しまない.