JAVA 4 02 functionパッケージ


リンクテキスト

java.util.関数パッケージ

  • は、複数の共通関数インタフェース
  • を提供する.

    パラメータが1つしかない関数インタフェース



    1. Supplier<T>

  • のみが
  • を返す.
    @FunctionalInterface
    public interface Supplier<T>{
    	T get();
    }
    例)
    Supplier<String> supplier = () -> "Hello World!";
    System.out.println(supplier.get());
    //Hello World!

    2. Consumer<T>

  • パラメータのみ
  • @FunctionalInterface
    public interface Consumer<T> {
        void accept(T t);
    
        default Consumer<T> andThen(Consumer<? super T> after) {
            Objects.requireNonNull(after);
            return (T t) -> { accept(t); after.accept(t); };
        }
    }

    andThen()

  • の1つの関数が終了すると、次のConsumerを連続的に使用できます.
  • andThen'()'これ以降!
  • 例)
    Consumer<String> consumer = (str) -> System.out.println(str.split(" ")[0]);
    consumer.accept("Hello World");	
    //Hello
    consumer.andThen(System.out::println).accept("Hello World");
    //Hello
    //Hello World
  • は、受信()のConsumerを先に処理し、その後
  • を処理する.
  • andThen()が受信した2番目のConsumerを処理します.
  • 👀どうして[0]ですか.文字列"Hello World"は1つしか受信していないので、
  • 文字列が
  • に分割されても
    -> 👀👀どうして?関数型では、関数に値の割り当てや変更はありません!!
  • 3. Function<T, R>

    @FunctionalInterface 
    public interface Function<T, R> { 
    	R apply(T t); 
    
    	default <V> Function<V, R> compose(Function<? super V, ? extends T> before) { 
    	Objects.requireNonNull(before); 
    	return (V v) -> apply(before.apply(v)); 
    } 
    
    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) { 
    	Objects.requireNonNull(after); 
    	return (T t) -> after.apply(apply(t)); 
    } 
    
    static <T> Function<T, T> identity() { return t -> t; } 
    }

    andThen()

  • の1つの関数が終了すると、次のConsumerを連続的に使用できます.
  • andThen'()'これ以降!
  • compose()

  • の最初の関数を実行する前に、関数を実行してから接続します.
  • 作曲‘()’これが先だ!!
  • static identity()


    自身の
  • 関数staticを返します.
    例)
    Function<String, Integer> function = str -> str.length();
    function.apply("Hello World");
    //암것도 안나옴...
    System.out.println(function.apply("Hello World"));
    //11

    4. Predicate<T>

    @FunctionalInterface
    public interface Predicate<T> {
    
        boolean test(T t);
    
        default Predicate<T> and(Predicate<? super T> other) {
            Objects.requireNonNull(other);
            return (t) -> test(t) && other.test(t);
        }
    
        default Predicate<T> negate() {
            return (t) -> !test(t);
        }
    
        default Predicate<T> or(Predicate<? super T> other) {
            Objects.requireNonNull(other);
            return (t) -> test(t) || other.test(t);
        }
    
        static <T> Predicate<T> isEqual(Object targetRef) {
            return (null == targetRef)
                    ? Objects::isNull
                    : object -> targetRef.equals(object);
        }
    
        @SuppressWarnings("unchecked")
        static <T> Predicate<T> not(Predicate<? super T> target) {
            Objects.requireNonNull(target);
            return (Predicate<T>)target.negate();
        }
    }
    例)
    	Predicate<String> predicate = (str) -> str.equals("Hello World");
    	System.out.println(predicate.test("Hell"));		//false
    	System.out.println(predicate.test("Hello"));	//false
    	System.out.println(predicate.test("Hello World"));	//true
    ソース

    Predicatの使い方



  • -> Predicate<T,R>
  • Quiz.


    次のスペースに適切な関数インタフェースを入力します.

    BooleanPredicate<T>Supplier<Integer>Consumer<Integer>

    2つのパラメータを持つ関数インタフェース(Bi~)



    3つのパラメータなら?直接定義。



    (パラメータタイプ==戻りタイプ)一致する関数タイプ

  • 単項演算子、二項演算子
  • タイプが同じなので、Predicate<Integer>個!

  • ex14_02_1
    リンクテキスト
    リファレンス
    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Consumer;
    import java.util.function.Function;
    import java.util.function.Predicate;
    import java.util.function.Supplier;
    
    public class Ex14_02_1 {
    
    	public static void main(String[] args) {
    		Supplier<Integer> s = () -> (int)(Math.random()*100)+1;	//1<=x<101
    		Consumer<Integer> c = i -> System.out.print(i+", ");	//출력
    		Predicate<Integer> p = i -> i%2==0;	//짝수인지 검사
    		Function<Integer, Integer> f = i -> i/10*10;	//**일의 자리 없애기
    		
    		List<Integer> list = new ArrayList<>();
    		makeRandomList(s, list);
    		System.out.println(list);
    		
    		printEvenNum(p, c, list);
    		
    		List<Integer> list2 = eraseIll(f, list);
    		System.out.println(list2);
    		
    	}
    	
    	//Supplier s를 받아(1~100 난수를 받아) list에 추가
    	static <T> void makeRandomList(Supplier<T> s, List<T> list) {
    		for(int i=0; i<10; i++)
    			list.add(s.get());
    	}
    	
    	//list를 받아 Predicate p로 짝수인지 검사하고, Consumer c로 출력
    	static <T> void printEvenNum(Predicate<T> p, Consumer<T> c, List<T> list) {
    		System.out.print("[");
    		for(T i : list) {	//**list의 모든요소 하나하나를 Integer i에 넣어서 
    			if(p.test(i))	//i가 짝수면 true, 홀수면 false
    				c.accept(i);//짝수면 Consumer 람다식대로 출력
    		}
    		System.out.println("]");
    	}
    	
    	//list와 같은 크기의 새 List를 만들어, Function f로 일의 자리 없애고 그 새 List에 저장
    	static <T> List<T> eraseIll(Function<T, T> f, List<T> list) {
    		List<T> newList = new ArrayList<T>(list.size());	//new ArrayList<T>(크기)
    		for(T i : list)
    			newList.add(f.apply(i));	//일의 자리를 없애서 새 newList에 저장
    		return newList;	//그 newList 반환, [요소1, 요소2, ...]
    		
    	}
    }
    [99, 2, 69, 89, 7, 83, 63, 50, 42, 20]
    [2, 50, 42, 20, ]
    [90, 0, 60, 80, 0, 80, 60, 50, 40, 20]

    Ref

  • 生活コードJAVA 1
  • オブジェクト化の説明
  • w3schools JAVA
  • 羅東彬
  • ジャワけっしょうせき
  • ジャワ議政石羽バニラ
  • クラスとオブジェクト