У меня есть Artist
класс следующим образом:Использование flatMap() в Java8
class Artist {
private final String name;
private final String origin;
private Stream<Artist> members;
public Artist(String name, String origin) {
this.name = name;
this.origin = origin;
this.members = null;
}
public Artist(String name, String origin,Stream<Artist> members) {
this.name = name;
this.origin = origin;
this.members = members;
}
public String getName() {
return name;
}
public String getOrigin() {
return origin;
}
public Stream<Artist> getMembers() {
return members;
}
@Override
public String toString() {
return name;
}
}
Теперь мы создаем список художников, где имя художника является группа или юридическим лицом. Для одного объекта "members"
атрибут остается null.Now списка выглядит следующим образом:
List<Artist> artists = Arrays.asList(
new Artist("Fossils","Kolkata", Stream.of(new Artist("Rupam Islam","Kolkata"), new Artist("Deep","Kolkata"),new Artist("Allan","Kolkata"), new Artist("Chandramouli","Kolkata"),new Artist("Tanmoy","Kolkata"))),
new Artist("Linkin Park","California",Stream.of(new Artist("Chester Bennington","California"),new Artist("Dave Farrell","California"), new Artist("Mike Shinoda","California"),new Artist("Rob Bourdon","California"),new Artist("Brad Delson","California"))),
new Artist("Cactus","Kolkata",Stream.of(new Artist("Sidhartha Sankar","Kolkata"),new Artist("Dibyendu Mukherjee","Kolkata"), new Artist("Ritaprabha","Kolkata"),new Artist("Sudipto","Kolkata"),new Artist("Mainak","Kolkata"))),
new Artist("Backstreet Boys","Florida",Stream.of(new Artist("A. J. McLean","Florida"),new Artist("Howie D.","Florida"),new Artist("Nick Carter","Florida"), new Artist("Kevin Richardson","Florida"), new Artist("Brian Littrell","Florida"))),
new Artist("Prohori","Kolkata",Stream.of(new Artist("Pritam","Kolkata"))));
Мы хотим иметь не из одного лица от «Калькутты». Использование внешней итерации мы можем иметь следующее решение:
int totalMembers = 0;
for (Artist artist : artists) {
if(artist.getOrigin().equals("Kolkata") {
Stream<Artist> members = artist.getMembers();
totalMembers += members.count();
}
}
Что будет решение для внутренней итерации с использованием stream()
и flatMap()
с помощью лямбда-выражения?
Я думал о решении, но может быть, это неверно.
int totalMember = artists.stream()
.filter(d -> d.getOrigin().equals("Kolkata"))
.flatMap(e -> e.getMembers())
.map(f -> 1).reduce(0, (a, b) -> a + b);
Большая вещь, почему это неправильно это у вас есть поле типа '' потока. Потоки могут использоваться только один раз, если вы вызываете свой код два раза подряд, вы получите исключение. Помимо этого, ваше решение можно улучшить, используя соответствующие встроенные функции (например, счетный коллектор), но в целом все в порядке. –
@SoumyaKantiNaskar немного неясно .. вы хотите, чтобы общее количество художников из определенного региона, где 'members' равно null? Взяв ваш пример: «Новый художник (« Ископаемые »,« Калькутта », Stream.of (новый художник (« Рупам Ислам »,« Калькутта »), новый художник (« Глубокий »,« Калькутта »), новый художник (" Аллан »,« Калькутта »), новый художник (« Чандрамули »,« Калькутта »), новый художник (« Танмой »,« Калькутта »))). Должно ли это производить ноль или 5? Вы хотите также считать внутренних художников? – Eugene
@SoumyaKantiNaskar ваш пример «внешней итерации» (помимо возможности бросать исключение NullPointerException, поскольку члены могут быть нулевыми), также не соответствует вашим собственным требованиям: «Мы не хотим иметь единого объекта», где «Для одного объекта», members "атрибут остается null. – Eugene