Я изучаю Stream, и во время одного из таких практических занятий я пытался объединить 2 потока разных типов String и Integer с помощью кода ниже:
Stream<String> fruitStream = Stream.of("Apple", "Mango", "Muskmalon", "Guvava");
Stream<Integer> vegetablesStream = Stream.of(1, 2, 3, 4);
Stream<String> mixStream = Stream.concat(fruitStream, vegetablesStream.map(i -> i.toString()));
mixStream.forEach(System.out :: println);
Он работал правильно и дал мне желаемый результат.
Затем я попытался использовать ссылку на метод:
Stream<String> mixStream = Stream.concat(fruitStream, vegetablesStream.map(Integer :: toString));
И стала выдавать ошибку:
Wrong 1st argument type. Found: 'java.util.stream.Stream<java.lang.String>', required: 'java.util.stream.Stream<? extends T>'
concat (java.util.stream.Stream<? extends T>, java.util.stream.Stream<? extends T>) in Stream cannot be applied to (java.util.stream.Stream<java.lang.String>, java.util.stream.Stream<R>)
reason: No compile-time declaration for the method reference is found
Когда я заменил свою ссылку на метод на String :: ValueOf, она работает нормально:
Stream<String> mixStream = Stream.concat(fruitStream, vegetablesStream.map(String :: valueOf));
Я не могу понять, почему Integer::toString не прошел, а String::valueOf прошел?