Wpis z mikrobloga

#java
Hej, uczę się interfejsów funkcyjnych i natrafiłem na zadanie które rozwaliło mi głowę (o stąd: https://hyperskill.org/learn/step/2398)

Mam sobie takie oto metody:

public static void printFilteredAccounts(List<Account> accounts) {
List<Account> nonEmptyAccounts = filter(accounts, s -> s.getBalance() > 0);

nonEmptyAccounts.forEach(a -> System.out.print(a.getNumber() + " "));

}

public static <T> List<T> filter(List<T> elems, Predicate<T> predicate) {
return elems.stream()
.filter(predicate)
.collect(Collectors.toList());
}

Moje pytanie brzmi: skąd w

List<Account> nonEmptyAccounts = filter(accounts, s -> s.getBalance() > 0);
przy lambdzie

s -> s.getBalance() > 0
Java wie, że ma s być tam pojedynczym obiektem, i to rodzaju Account, a nie coś czymś innym? I skąd od razu wie, że to predykat? Jakim cudem?

Do tej pory rozumiałem lambdy rozumiałem tak:

Function<String, String> helloFunction = (name) -> "Hello" + name;
System.out.println(helloFunction.apply("John"));

Jest to ok, mam argument String i zwracam String, no to ok, wszystko jasne. Ale dlaczego do cholery mogę skumać skąd Java wie, że określenie typu

Predicate<Account> accountPredicate = s -> s.getBalance() > 0
ma zwracać boolean? A tym bardziej, jeżeli lambda jest zastosowana w funkcji, takiej jak tutaj:

filter(accounts, s -> s.getBalance() > 0)
Jak?
arct2 - #java 
Hej, uczę się interfejsów funkcyjnych i natrafiłem na zadanie które ro...

źródło: maxresdefault

Pobierz
  • 4
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Jest to ok, mam argument String i zwracam String, no to ok, wszystko jasne. Ale dlaczego do cholery mogę skumać skąd Java wie, że określenie typu ma zwracać boolean? A tym bardziej, jeżeli lambda jest zastosowana w funkcji, takiej jak tutaj:


@arct2: bo interfejs Predicate posiada metodę test(T t) która zwraca boolean
  • Odpowiedz
Java wie, że ma s być tam pojedynczym obiektem, i to rodzaju Account, a nie coś czymś innym? I skąd od razu wie, że to predykat? Jakim cudem?


@arct2: generyki, poczytaj sobie o generykach
  • Odpowiedz
@arct2: To dosyć proste. Skąd Ty wiesz, że Predicate przyjmuje Account?
Czy jak zapiszesz to w ten sposób, będzie jaśniej:

Predicate<Account> accountPredicate = s -> s.getBalance() > 0;
List<Account> nonEmptyAccounts = filter(accounts, accountPredicate);

Definiujesz predykat, z typem Account, to stąd Java wie, że w predykacie ma do czynienia z obiektem Account,
  • Odpowiedz