Java Lambda 표현식의 집합에서 흐름으로

4569 단어 javalambda표현식
집합에서 흐름으로
이제 우리는 코드로 특정한 집합에 대한 교체 작업을 구체적으로 표시합니다. 우리는 연락처를 표시하기 위해 Contact 클래스를 정의하고 ContactList의 모든 String 유형의 연락처 이름을 Contact 클래스에 포장하기를 원합니다.

List<Contact> contacts = new ArrayList<>();
contactList.forEach(new Consumer<String>() {
 @Override
 public void accept(String s) {
  Contact contact = new Contact();
  contact.setName(s);
  contacts.add(contact);
 }
});
다음으로 우리는 연결할 수 있는 모든 연락처를 선별하여 유효한 연락처 집합에 넣기를 희망한다.

List<Contact> validContacts = new ArrayList<>();
contacts.forEach(new Consumer<Contact>() {
 @Override
 public void accept(Contact c) {
  if (c.call())
   validContacts.add(c);
 }
});
System.out.println(validContacts.size());
이를 통해 알 수 있듯이 첫 번째 작업은 String 형식의 데이터를 Contact로 변환하고, 두 번째는 모든 Contact에 콜 () 방법을 호출하여 결과가 true인 연락처를 선별하여 다른 집합에 수집하고, 마지막으로 연결할 수 있는 연락처 수를 집계합니다.
이 과정에서 조작 행위는 각 집합 내부에 완전히 폐쇄되어 어떠한 외부 변수도 도입할 필요가 없다.
처리의 시작, 진행, 끝에서 대상은 작업 사이에서 질서정연한 서열처럼 이동한다. 이것이 바로 흐름의 특징, 즉'이동 중의 데이터'이다.
진정한 흐름은 집합과 현저한 차이가 있다. 이 흐름은'선택적인 질서 있는 값 서열'만을 표시하고,'이 값에 어떤 저장도 제공할 필요가 없다'. 이것이 바로 왜 Stream이 자바8-API에서 하나의 종류가 아닌 인터페이스로 정의되었는가이다.

public interface Stream<T> extends BaseStream<T, Stream<T>> {}
Stream는 대상의 흐름이고 Double Stream, Long Stream 및 Int Stream은 double, long 및 int 세 가지 기본 유형의 흐름입니다.
이제 String에서 Contact까지의 맵을 흐름으로 다시 작성합니다.

Stream<Contact> contactStream = contactList.stream().map(s -> new Contact().setName(s));
stream () 은 소스에서 파이프를 가져와 흐름의 시작을 나타냅니다.
맵 () 은 파이프의 흐름을 수신하고 이를 변환합니다. 이 예에서 우리는 파이프의 String을 Contact 클래스로 비추었습니다. 이로써 String 파이프는 Contact 파이프가 됩니다.
이전 코드는 다음과 같이 분할할 수 있습니다.

Stream<String> stringStream = contactList.stream();
Stream<Contact> contactStream1 = stringStream.map(s -> new Contact().setName(s));
기본적으로 흐름 조작을 파악한 후에 우리는 지금 단숨에 흐름을 사용하여 최종 결과를 얻는다.

long validContactCounter = 
 contactList.stream()
  .map(s -> new Contact().setName(s))
  .filter(c -> c.call())
  .count();
우리가 흐름에 대해 풍부한 조작을 할 수 있음을 알 수 있다. 필터, 계수, 찾기 등은 여기에 표시되지 않는다.
작은 매듭
흐르는 방식으로 데이터를 처리하면 코드를 간소화할 수 있을 뿐만 아니라 해야 할 조작도 돋보일 수 있기 때문에 당연히 언뜻 보기에는 좀 이해하기 어렵다.
허가독성을 희생했지만 교환 조건으로 우리는 이런 순서로 실행된 흐름 작업에서 상응하는 순환 버전의 성능을 두 배로 얻었다.
마찬가지로 흐름 조작을 병행하는 것은 대형 데이터 집합에 비범한 효과가 있을 것이다.
이 소절 관련 코드:
(Contact.java)

import java.util.Random;
public class Contact {
 private String name;
 private long number;
 private Random random;
 public Contact() {
  random = new Random();
 }
 public String getName() {
  return name;
 }
 public Contact setName(String name) {
  this.name = name;
  return this;
 }
 public long getNumber() {
  return number;
 }
 public Contact setNumber(long number) {
  this.number = number;
  return this;
 }
 public boolean call() {
  return random.nextBoolean();
 }
}
( )

List<Contact> contacts = new ArrayList<>();
contactList.forEach(new Consumer<String>() {
 @Override
 public void accept(String s) {
  Contact contact = new Contact();
  contact.setName(s);
  contacts.add(contact);
 }
});
List<Contact> validContacts = new ArrayList<>();
contacts.forEach(new Consumer<Contact>() {
 @Override
 public void accept(Contact contact) {
  if (contact.call())
   validContacts.add(contact);
 }
});
System.out.println(validContacts.size());
//--- Stream is coming ---//
Stream<Contact> contactStream = contactList.stream().map(s -> new Contact().setName(s));
//--- Break this code ---//
Stream<String> stringStream = contactList.stream();
Stream<Contact> contactStream1 = stringStream.map(s -> new Contact().setName(s));
//--- All in one ---//
long validContactCounter = 
 contactList.stream()
  .map(s -> new Contact().setName(s))
  .filter(c -> c.call())
  .count();
System.out.println(validContactCounter);
실행 결과:


위에서 말한 것은 편집자가 여러분께 소개한 Java Lambda 표현식의 집합에서 흐름으로 여러분에게 도움이 되었으면 합니다. 만약에 궁금한 것이 있으면 저에게 메시지를 남겨 주십시오. 편집자는 제때에 여러분에게 회답할 것입니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기