原來(lái) Lamda 表達(dá)式是這樣寫(xiě)的
低并發(fā)的友友們好,我是閃客。List?studentList?=?gen();
Map?map?=?studentList?.stream()
????????.collect(Collectors.toMap(Student::getId,?a?->?a,?(a,?b)?->?a));
1. 確認(rèn) Lamda 表達(dá)式的類(lèi)型
2. 找到要實(shí)現(xiàn)的方法
3. 實(shí)現(xiàn)這個(gè)方法
確認(rèn) Lamda 表達(dá)式的類(lèi)型
@FunctionalInterface
public?interface?Runnable?{
????public?abstract?void?run();
}這就是一個(gè)標(biāo)準(zhǔn)的函數(shù)式接口。 因?yàn)橹挥幸粋€(gè)抽象方法。而且這個(gè)接口上有個(gè)注解
//?沒(méi)有實(shí)現(xiàn)任何抽象方法的接口
@FunctionalInterface
public?interface?MyRunnable?{}
//?編譯后控制臺(tái)顯示如下信息
Error:(3,?1)?java:?
??意外的?@FunctionalInterface?注釋
??MyRunnable?不是函數(shù)接口
????在?接口?MyRunnable?中找不到抽象方法
@FunctionalInterface
public?interface?Consumer<T>?{
????void?accept(T?t);
????default?Consumer?andThen(Consumer?super?T>?after)? {...}
}
@FunctionalInterface
public?interface?Predicate<T>?{
????boolean?test(T?t);
????
????default?Predicate?and(Predicate?super?T>?other)? {...}
????default?Predicate?negate()? {...}
????default?Predicate?or(Predicate?super?T>?other)? {...}
????
????static??Predicate?isEqual(Object?targetRef)? {...}
????static??Predicate?not(Predicate?super?T>?target)? {...}
}
找到要實(shí)現(xiàn)的方法
@FunctionalInterface
public?interface?Runnable?{
????public?abstract?void?run();
}
@FunctionalInterface
public?interface?Consumer<T>?{
????void?accept(T?t);
????default?Consumer?andThen(Consumer?super?T>?after)? {...}
}
@FunctionalInterface
public?interface?Predicate<T>?{
????boolean?test(T?t);
????default?Predicate?and(Predicate?super?T>?other)? {...}
????default?Predicate?negate()? {...}
????default?Predicate?or(Predicate?super?T>?other)? {...}
????static??Predicate?isEqual(Object?targetRef)? {...}
????static??Predicate?not(Predicate?super?T>?target)? {...}
}
實(shí)現(xiàn)這個(gè)方法
Predicate?predicate?=?new?Predicate()?{
????@Override
????public?boolean?test(String?s)?{
????????return?s.length()?!=?0;
????}
};
Predicate?predicate?=?
????(String?s)?->?{
????????return?s.length()?!=?0;
????};?看出來(lái)了么?這個(gè) Lamda 語(yǔ)法由三部分組成:
參數(shù)塊:就是前面的 (String s),就是簡(jiǎn)單地把要實(shí)現(xiàn)的抽象方法的參數(shù)原封不動(dòng)寫(xiě)在這。
小箭頭:就是 -> 這個(gè)符號(hào)。
代碼塊:就是要實(shí)現(xiàn)的方法原封不動(dòng)寫(xiě)在這。
Predicate?predicate?=?
????(s)?->?{
????????return?s.length()?!=?0;
????};
Predicate?predicate?=?
????s?->?{
????????return?s.length()?!=?0;
????};
Predicate?p?=?s?->?s.length()?!=?0;
@FunctionalInterface
public?interface?Runnable?{
????public?abstract?void?run();
}
Runnable?r?=?()?->?System.out.println("I?am?running");
new?Thread(()?->?System.out.println("I?am?running")).start();
?
多個(gè)入?yún)?/span>
@FunctionalInterface
public?interface?BiConsumer<T,?U>?{
????void?accept(T?t,?U?u);
????//?default?methods?removed
}BiConsumer?randomNumberPrinter?=?
????????(random,?number)?->?{
????????????for?(int?i?=?0;?i?????????????????System.out.println("next?random?=?"?+?random.nextInt());
????????????}
????????};
????????
randomNumberPrinter.accept(new?Random(314L),?5)); @FunctionalInterface
public?interface?BiFunction<T,?U,?R>?{
????R?apply(T?t,?U?u);
????//?default?methods?removed
}
//?看個(gè)例子
BiFunction?findWordInSentence?=?
????(word,?sentence)?->?sentence.indexOf(word);
發(fā)現(xiàn)規(guī)律了沒(méi)
@FunctionalInterface
public?interface?DoubleFunction<R>?{
????R?apply(double?value);
}
@FunctionalInterface
public?interface?Function<T,?R>?{
????R?apply(T?t);
}
用我們常見(jiàn)的 Stream 編程熟悉一下
List?studentList?=?gen();
Map?map?=?studentList?.stream()
????????.collect(Collectors.toMap(Student::getId,?a?->?a,?(a,?b)?->?a)); Collectors.toMap(Student::getId,?a?->?a,?(a,?b)?->?a)Collectors.toMap(a?->?a.getId(),?a?->?a,?(a,?b)?->?a)
public?static??Collector >?toMap(
????????Function?super?T,???extends?K>?keyMapper,
????????Function?super?T,???extends?U>?valueMapper,
????????BinaryOperator?mergeFunction)?
{
????return?toMap(keyMapper,?valueMapper,?mergeFunction,?HashMap::new);
}
Collectors.toMap(a?->?a.getId(),?Function.identity(),?(a,?b)?->?a)
@FunctionalInterface
public?interface?Function<T,?R>?{
????R?apply(T?t);?
????...
????static??Function ?identity()? {
????????return?t?->?t;
????}
}
@FunctionalInterface
public?interface?Predicate<T>?{
????boolean?test(T?t);
????default?Predicate?and(Predicate?super?T>?other)? {
????????Objects.requireNonNull(other);
????????return?(t)?->?test(t)?&&?other.test(t);
????}
}
Predicate?p?=?
????s?->?(s?!=?null)?&&?
????!s.isEmpty()?&&?
????s.length()?5;
Predicate?nonNull?=?s?->?s?!=?null;
Predicate?nonEmpty?=?s?->?s.isEmpty();
Predicate?shorterThan5?=?s?->?s.length()?5;
Predicate?p?=?nonNull.and(nonEmpty).and(shorterThan5); 方法引用
Function?toLength?=?s?->?s.length();
Function?toLength?=?String::length;
Function?getName?=?user?->?user.getName();
Function?toLength?=?User::getName;
Consumer?printer?=?s?->?System.out.println(s);
Consumer?printer?=?System.out::println;
Supplier>?newListOfStrings?=?()?->?new?ArrayList<>();
Supplier>?newListOfStrings?=?ArrayList::new;
總結(jié)
1. 確認(rèn) Lamda 表達(dá)式的類(lèi)型
2. 找到要實(shí)現(xiàn)的方法
3. 實(shí)現(xiàn)這個(gè)方法
評(píng)論
圖片
表情
