> Java > java지도 시간 > 본문

Java8 Stream의 일반적인 방법은 무엇입니까?

王林
풀어 주다: 2023-05-05 17:01:07
앞으로
1043명이 탐색했습니다.

1. 빠르게 목록 만들기

예를 들어, 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명의 사용자를 만들어 목록에 추가하겠습니다.

(1), new a 목록, 하나씩 추가

List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
로그인 후 복사

(2), 스트림 흐름: 동적 목록 생성, 요소 추가 가능

// stream流,创建的是动态数组,可以添加元素
List<User> userList = Stream.of(user1, user2, user3).collect(Collectors.toList());
로그인 후 복사

(3), 고정 길이 목록을 생성하는 경우 Arrays.asList(… args)를 사용하여 직접 목록을 반환합니다

핵심은 배열의 크기가 고정되어 있으므로 이 목록에 요소를 추가할 수 없다는 것입니다.

새 항목을 추가하기 위해 add 메소드를 호출하면 됩니다. 요소의 경우 예외가 보고됩니다. java.lang.UnsupportedOperationException

요소가 수정되면 다음을 사용할 수 있습니다.

// 本质是将一个数组转成list,数组的大小是固定的,所以此list不能添加元素
// 如果调用add方法增加新的元素,会报异常:java.lang.UnsupportedOperationException
List<String> s = Arrays.asList("1","2","3")
로그인 후 복사

2 개체의 특정 열을 가져옵니다.

위의 userList를 예로 들어 보겠습니다. 목록에 있는 모든 사용자의 이름 속성을 꺼내어 새 목록에 넣습니다:

(1), traverse

// 遍历
List<String> userNameList = new ArrayList<>();
for (User user : userList) {
    userNameList.add(user.getName());
}
로그인 후 복사

(2) , 스트림 스트림: map

// Stream流
List<String> userNameList = userList.stream().map(User::getName).collect(Collectors.toList());
로그인 후 복사

3. 판단 조건에 따라

또한 위의 userList를 예로 들어 userList

(1)에서 이름이 비어 있지 않은 사용자를 필터링하고 Traverse하고 if

List<User> newUserList = new ArrayList<>();
// if判断
for (User user : userList) {
    if(user.getName() != null) {
        newUserList.add(user); 
    }
}
로그인 후 복사

(2)를 추가하고 Stream flow : filter

// 获取userName不为空的user的List
List<User> userList = userList.stream().filter(user-> user.getName() != null).collect(Collectors.toList());
로그인 후 복사

4. Grouping

나이에 따라 userList의 사용자를 그룹화합니다:

(1), 순회하고 if

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);
}
로그인 후 복사

(2), Stream: groupingBy

Map<String, List<User>> map =userList.stream().collect( Collectors.groupingBy(User::getAge, Collectors.toList()));
로그인 후 복사

5, summation

(1)을 추가합니다. , int, double, long:

합산의 일반적인 순회 방법은 위와 유사하므로 예를 들어주지 않겠습니다.

// int、double、long:
double max = userList.stream().mapToDouble(User::getHeight).sum();
로그인 후 복사

6, Map 및 List interchange

( 1), list to map:

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));
로그인 후 복사

(2), 목록에 매핑:

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());
로그인 후 복사

7 판단하기

(1), anyMatch():

판단 조건에서 어떤 요소라도 성공하면 true가 반환됩니다.

예를 들어 위의 userlList에서 높이가 175보다 큰지 판단하고 싶습니다:

    userList.stream().anyMatch(user -> user.getHeight() > 175);
로그인 후 복사

(2), allMatch():

allMatch: Elements 판단 조건에서 모두 true를 반환합니다.

예를 들어 위의 userlList에서 모든 높이가 175보다 큰지 확인하고 싶습니다.

    userList.stream().allMatch(user -> user.getHeight() > 175);
로그인 후 복사

(3), noneMatch():

반대로; allMatch, 조건의 요소를 결정하고 모두가 아님, true

    userList.stream().noneMatch(user -> user.getHeight() > 175);
로그인 후 복사

(4)를 반환하고 대상 합계를 찾습니다:

    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의 일반적인 방법은 무엇입니까?

위 내용은 Java8 Stream의 일반적인 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!