List<User> users = List.of(new User(1, "Max"));
// Выведем всех пользователей на экран
users.stream()
.forEach(System.out::println); // => User{id=1, name='Max'}
List<User> users2 = List.of(new User(3, "Nick"));
// Преобразуем списки пользователей в словарь
Map<Integer, String> namesMap = Stream.concat(users.stream(), users2.stream())
.collect(Collectors.toMap(User::getId, User::getName, (v1, v2) -> v1));
System.out.println(namesMap); // => {1=Max, 3=Nick}
// Пользователь с самым коротким именем
User firstUser = users.stream()
.sorted(Comparator.comparing(x -> x.getName().length()))
.findFirst()
.orElse(null);
System.out.println(firstUser); // => User{id=1, name='Max'}
// Пользователь с наименьшим id
User firstUserAgain = users.stream()
.sorted(Comparator.comparingInt(x -> x.getId()))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("no users found"));
System.out.println(firstUserAgain); // => User{id=1, name='Max'}
private static Integer getUserId(String name) throws IllegalArgumentException {
for (User user : users) {
if (user.getName().equals(name)) {
return user.getId();
}
}
throw new IllegalArgumentException("No user with such name!");
}
// throws IllegalArgumentException
Integer id = getUserId("Ivan");
System.out.println(id);
Класс User
public class User {
private Integer id;
private String name;
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("User{");
sb.append("id=").append(id);
sb.append(", name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
}
Метод flatMap()
Метод стрима flatMap()
преобразует стрим стримов в один плоский стрим. Например, у нас есть двумерный массив и нам нужно сделать его плоским и отфильтровать его элементы:
int[][] array = {{2, 3}, {4, 5, 6}, {7, 8, 10}};
List<Integer> collect = Stream.of(array) // Получаем стрим массивов Stream<Integer[]>
.flatMap(element -> Stream.of(element)) // Stream<Integer>
.filter(x -> x % 2 == 0) // filter only even numbers
.collect(Collectors.toList()); // return a List
Функция, переданная в flatMap()
в качестве параметра element -> Stream.of(element)
создает свой вложенный стрим из каждого элемента стрима. А метод flatMap()
выпрямляет этот стрим, делая его плоским. В итоге получаем стрим целых чисел. Этот же код можно записать немного короче, используя ссылку на метод:
List<Integer> collect = Stream.of(array)
.flatMap(Stream::of)
.filter(x -> x % 2 == 0)
.collect(Collectors.toList());