예를 들어, User라는 엔터티 클래스가 있고 User에는 Name이라는 속성이 있습니다.
public class User { public User(String name, String age, int height) { this.name = name; this.age = age; this.height = height; } private String name; private String age; private int height; // setter、getter方法我就不写了 } // 创建三个user User user1 = new User("111", "18", 180); User user2 = new User("222", "18", 175); User user3 = new User("333", "19", 170);
이제 3명의 사용자를 만들어 목록에 추가하겠습니다.
List<User> userList = new ArrayList<>(); userList.add(user1); userList.add(user2); userList.add(user3);
// stream流,创建的是动态数组,可以添加元素 List<User> userList = Stream.of(user1, user2, user3).collect(Collectors.toList());
핵심은 배열의 크기가 고정되어 있으므로 이 목록에 요소를 추가할 수 없다는 것입니다.
새 항목을 추가하기 위해 add 메소드를 호출하면 됩니다. 요소의 경우 예외가 보고됩니다. java.lang.UnsupportedOperationException
요소가 수정되면 다음을 사용할 수 있습니다.
// 本质是将一个数组转成list,数组的大小是固定的,所以此list不能添加元素 // 如果调用add方法增加新的元素,会报异常:java.lang.UnsupportedOperationException List<String> s = Arrays.asList("1","2","3")
위의 userList를 예로 들어 보겠습니다. 목록에 있는 모든 사용자의 이름 속성을 꺼내어 새 목록에 넣습니다:
// 遍历 List<String> userNameList = new ArrayList<>(); for (User user : userList) { userNameList.add(user.getName()); }
// Stream流 List<String> userNameList = userList.stream().map(User::getName).collect(Collectors.toList());
또한 위의 userList를 예로 들어 userList
List<User> newUserList = new ArrayList<>(); // if判断 for (User user : userList) { if(user.getName() != null) { newUserList.add(user); } }
// 获取userName不为空的user的List List<User> userList = userList.stream().filter(user-> user.getName() != null).collect(Collectors.toList());
나이에 따라 userList의 사용자를 그룹화합니다:
Map<String, List<User>> map = new HashMap<>(); // if判断 for (User user : userList) { if (map.get(user.getAge()) == null) { map.put(user.getAge(), new ArrayList()); } map.get(user.getAge()).add(user); }
Map<String, List<User>> map =userList.stream().collect( Collectors.groupingBy(User::getAge, Collectors.toList()));
합산의 일반적인 순회 방법은 위와 유사하므로 예를 들어주지 않겠습니다.
// int、double、long: double max = userList.stream().mapToDouble(User::getHeight).sum();
a, traversal:
Map<String, User> userMap = new Map<>(); for (User user : userList) { userMap.put(user.getName(), user); }
b, stream:
Collectors의 toMap 메소드를 사용하여 List를 변환하면 일반적으로 두 가지 문제에 직면하게 됩니다.
(1) 변환 맵, 키 중복 문제
코드에서 (key1, key2)->key2 표현식을 사용하면 이러한 종류의 문제를 해결할 수 있습니다. 중복된 키가 있는 경우 key2를 사용하여 이전 key1을 덮어쓰거나 (key1, key2)->key1로 정의하고 key1을 유지하며 자신의 비즈니스 시나리오에 따라 조정할 수 있습니다.
(2) Null 포인터 예외, 즉 map으로 변환된 값이 null입니다. 이는 필터로 필터링할 수 있습니다.
Map<String, User> userMap= userList.stream().collect(Collectors.toMap(User::getName, Function.identity(),(key1, key2)->key2));
a, 순회:
List<User> userList = new List<>(); for (String userName : userMap.keySet()) { userList.add(userMap.get(userName)); }
b, 스트림:
List<User> userList = userMap.entrySet().stream().map(e ->e.getValue()).collect(Collectors.toList());
판단 조건에서 어떤 요소라도 성공하면 true가 반환됩니다.
예를 들어 위의 userlList에서 높이가 175보다 큰지 판단하고 싶습니다:
userList.stream().anyMatch(user -> user.getHeight() > 175);
allMatch: Elements 판단 조건에서 모두 true를 반환합니다.
예를 들어 위의 userlList에서 모든 높이가 175보다 큰지 확인하고 싶습니다.
userList.stream().allMatch(user -> user.getHeight() > 175);
반대로; allMatch, 조건의 요소를 결정하고 모두가 아님, true
userList.stream().noneMatch(user -> user.getHeight() > 175);
userList.stream().filter(user -> user.getHeight() > 175).count();
모든 인쇄 결과:
System.out.println(userList.stream(). anyMatch(user -> user.getHeight() > 175));
System.out.println(userList.stream().allMatch(user -> user.getHeight() > 175));
System. out.println(userList.stream( ).noneMatch(user -> user.getHeight() > 175));
System.out.println(userList.stream().filter(user -> user.getHeight( ) > 175).count( ));
위 내용은 Java8 Stream의 일반적인 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!