lambda ifadeleri veya fonksiyonel arayüzler hakkında hakkında hiçbir şey söylemeden önce, size gerçekten sorunlu hata hakkında konuşmak zorunda: bir iş parçacığı üzerinderun()
aradığınız! Eğer yeni bir iş parçacığı başlatmak istiyorsanız kod sırayla çalıştırmak istiyorsanız, bir Thread
(ama sadece Runnable
) oluşturmayın, Thread
örneğinde start()
aramak zorunda. bahsedilen
, birleştirme fonksiyonlar, örneğin Java 8 fonksiyonel arayüzleri bazı default
yöntem vardır iki Function
s'yi Function.andThen(…)
üzerinden zincirleyebilirsiniz ancak mevcut kombinasyonlar tamamlanmaktan uzaktır.
belli birleştirerek görev uygulamanızda tekrar ediyorsa, yarar yöntemleri oluşturmayı düşünebilirsiniz:
public static <T> Runnable bind(T value, Consumer<T> c) {
return()->c.accept(value);
}
public static <T,U> Consumer<U> compose(Function<U,T> f, Consumer<? super T> c) {
return u->c.accept(f.apply(u));
}
new Thread(bind("Hello 1", compose(upper, d))).start();
new Thread(bind("Hello 2", compose(lower, d))).start();
Fakat bu üç parça daha akışı API için bir görev gibi bak:
Stream.of("Hello 1").map(upper).forEach(d);
Stream.of("Hello 2").map(lower).forEach(d);
Yeni iş parçacığının oluşturulmasını burada bırakmadım çünkü zaten herhangi bir fayda.
Gerçekten paralel işlem istiyorsanız, Çerezsiz bazında yapabilirsiniz:
"Hello 1".chars().parallel()
.map(Character::toUpperCase).forEachOrdered(c->System.out.print((char)c));
ama hala görevin basitlik verilen herhangi yarar ve sabit havai olmayacak paralel işlem. System.out :: println, dize :: toUpperCase:
Bu lambda'lar yerine _method references_ kullanmak için tüm ideal adaylardır. –