JAVA 4 02 functionパッケージ
リンクテキスト
は、複数の共通関数インタフェース を提供する.
のみが を返す.パラメータのみ の1つの関数が終了すると、次のConsumerを連続的に使用できます. andThen'()'これ以降! 例)は、受信()のConsumerを先に処理し、その後 を処理する. andThen()が受信した2番目のConsumerを処理します. 👀どうして 文字列がに分割されても
-> 👀👀どうして?関数型では、関数に値の割り当てや変更はありません!! の1つの関数が終了すると、次のConsumerを連続的に使用できます. andThen'()'これ以降! の最初の関数を実行する前に、関数を実行してから接続します. 作曲‘()’これが先だ!!
自身の関数
例)
->
次のスペースに適切な関数インタフェースを入力します.
①
単項演算子、二項演算子 タイプが同じなので、
ex14_02_1
リンクテキスト
リファレンス 生活コードJAVA 1 オブジェクト化の説明 w3schools JAVA 羅東彬 ジャワけっしょうせき ジャワ議政石羽バニラ クラスとオブジェクト
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()
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
[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()
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.
次のスペースに適切な関数インタフェースを入力します.
①
Boolean
② Predicate<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
Reference
この問題について(JAVA 4 02 functionパッケージ), 我々は、より多くの情報をここで見つけました https://velog.io/@lecharl/JAVA402テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol