Java java지도 시간 Java8의 새로운 기능인 람다의 역할을 해석합니다.

Java8의 새로운 기능인 람다의 역할을 해석합니다.

Jun 17, 2017 pm 02:11 PM
java8 효과 특성 해석

우리는 람다가 Java에 클로저 개념을 도입하기를 오랫동안 기다려왔지만 이를 컬렉션에 사용하지 않으면 많은 가치를 잃게 됩니다. 기존 인터페이스를 람다 스타일로 마이그레이션하는 문제는 기본 방법을 통해 해결되었습니다. 이 기사에서는 Java 컬렉션의 배치 데이터 작업을 심층적으로 분석하고 람다의 가장 강력한 효과에 대한 미스터리를 풀 것입니다.

우리는 람다가 Java에 클로저 개념을 도입하기를 오랫동안 기다려왔지만 컬렉션에서 사용하지 않으면 많은 가치를 잃습니다. 기존 인터페이스를 람다 스타일로 마이그레이션하는 문제는 기본 메서드를 통해 해결되었습니다. 이 기사에서는 Java 컬렉션의 대량 데이터 작업(대량 작업)을 심층적으로 분석하고 람다의 가장 강력한 역할에 대한 미스터리를 풀어보겠습니다.

1. JSR335에 대하여

JSR은 Java Spec Requests의 약자로 Java 사양 요청을 의미합니다. Java 8 버전의 주요 개선 사항은 Java를 만드는 것을 목표로 하는 Lambda 프로젝트(JSR 335)입니다. 멀티 코어의 경우 프로세서가 코드를 작성합니다.

2. 외부 VS 내부 반복

과거 Java 컬렉션은 내부 반복을 표현할 수 없었고 for 또는 while 루프인 외부 반복 방법만 제공했습니다.


List persons = asList(new Person("Joe"), new Person("Jim"), new Person("John"));
for (Person p : persons) {
 p.setLastName("Doe");
}
로그인 후 복사

위의 예는 소위 외부 반복이라는 이전 접근 방식입니다. 루프는 고정 시퀀스 루프입니다. 오늘날의 멀티 코어 시대에 병렬 루프를 실행하려면 위의 코드를 수정해야 합니다. 효율성이 얼마나 향상될 수 있는지는 아직 불확실하며 특정 위험(스레드 안전 문제 등)이 발생할 수 있습니다.

내부 반복을 설명하려면 Lambda와 같은 클래스 라이브러리를 사용해야 합니다. 람다와 Collection을 사용하겠습니다.forEach위 루프를 다시 작성합니다.


persons.forEach(p->p.setLastName("Doe"));
로그인 후 복사

이제 jdk 라이브러리가 루프를 제어합니다. 각 개인 객체에 성이 어떻게 설정되는지 걱정할 필요가 없습니다. 라이브러리는 실행 환경, 병렬, 비순차 또는 지연 로딩에 따라 이를 수행하는 방법을 결정할 수 있습니다. 이는 내부 반복이며 클라이언트는 p.setLastName 동작을 데이터로 API에 전달합니다. 실제로 내부 반복은 컬렉션의 배치 작업과 밀접한 관련이 없습니다. 이를 통해 문법 표현의 변화를 느낄 수 있습니다. 일괄 작업과 관련하여 정말 흥미로운 점은 새로운 스트림 API입니다. 새로운 java.util.stream 패키지가 JDK 8에 추가되었습니다.

3. 스트림 API

스트림은 데이터 스트림만 나타내며 데이터 구조가 없으므로 한 번 순회한 후에는 더 이상 순회할 수 없습니다. (이 점은 컬렉션과 달리 프로그래밍 시 주의해야 합니다. 아무리 많이 탐색하더라도 그 안에 여전히 데이터가 있습니다. 소스는 컬렉션, 배열, IO 등이 될 수 있습니다.

3.1 중간 및 종료 방법

플로우 기능은 빅데이터 운영을 위한 인터페이스를 제공하여 데이터 운영을 보다 쉽고 빠르게 만드는 것입니다. 필터링, 매핑, 순회 횟수 감소 등의 메서드가 있습니다. 이러한 메서드는 중간 메서드와 터미널 메서드의 두 가지 유형으로 구분됩니다. 중간 메서드는 기본적으로 항상 Stream을 반환해야 합니다. 최종 결과를 얻고 싶습니다. 그렇다면 엔드포인트 작업을 사용하여 스트림에서 생성된 최종 결과를 수집해야 합니다. 이 두 메서드의 차이점은 반환 값을 살펴보는 것입니다. Stream이면 중간 메서드이고, 그렇지 않으면 end 메서드입니다.

여러 중간 방법(filter, map)과 끝점 방법(collect, sum)에 대한 간략한 소개

3.1.1Filter

데이터 스트림에서 필터링 기능을 구현하는 것은 우리가 할 수 있는 가장 자연스러운 작업입니다. 먼저 생각해 보세요. Stream 인터페이스는 필터 조건을 정의하는 람다 식 을 사용하는 작업을 나타내는 Predicate 구현을 허용할 수 있는 필터 메서드를 노출합니다.


List persons = …
Stream personsOver18 = persons.stream().filter(p -> p.getAge() > 18);//过滤18岁以上的人
로그인 후 복사

3.1.2Map

객체 변환 등의 일부 데이터를 지금 필터링한다고 가정해 보겠습니다. Map 연산을 통해 입력 매개변수를 받아들이고 이를 반환하는 함수 구현(Function의 일반 T 및 R은 각각 실행 입력 및 실행 결과를 나타냄)을 실행할 수 있습니다. 먼저 익명 내부 클래스 형식으로 이를 설명하는 방법을 살펴보겠습니다.


Stream adult= persons
    .stream()
    .filter(p -> p.getAge() > 18)
    .map(new Function() {
     @Override
     public Adult apply(Person person) {
      return new Adult(person);//将大于18岁的人转为成年人
     }
    });
로그인 후 복사

이제 위의 예를 람다 식으로 변환합니다.



Stream map = persons.stream()
     .filter(p -> p.getAge() > 18)
     .map(person -> new Adult(person));
로그인 후 복사

3.1.3Count

The count 메소드는 스트림 결과의 최종 통계를 만들고 int를 반환할 수 있는 스트림의 끝점 메소드입니다. 예를 들어 18세


int countOfAdult=persons.stream()
      .filter(p -> p.getAge() > 18)
      .map(person -> new Adult(person))
      .count();
로그인 후 복사

3.1.4Collect

collect 메소드도 마찬가지입니다. 최종 결과를 수집하는 스트림의 엔드포인트 메소드



List adultList= persons.stream()
      .filter(p -> p.getAge() > 18)
      .map(person -> new Adult(person))
      .collect(Collectors.toList());
로그인 후 복사

또는 특정 구현 클래스를 사용하여 결과를 수집하려는 경우:



List adultList = persons
     .stream()
     .filter(p -> p.getAge() > 18)
     .map(person -> new Adult(person))
     .collect(Collectors.toCollection(ArrayList::new));
로그인 후 복사

篇幅有限,其他的中间方法和终点方法就不一一介绍了,看了上面几个例子,大家明白这两种方法的区别即可,后面可根据需求来决定使用。

3.2顺序流与并行流

每个Stream都有两种模式:顺序执行和并行执行。

顺序流:


List <Person> people = list.getStream.collect(Collectors.toList());
로그인 후 복사

并行流:


List <Person> people = list.getStream.parallel().collect(Collectors.toList());
로그인 후 복사

顾名思义,当使用顺序方式去遍历时,每个item读完后再读下一个item。而使用并行去遍历时,数组会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。

3.2.1并行流原理:


List originalList = someData;
split1 = originalList(0, mid);//将数据分小部分
split2 = originalList(mid,end);
new Runnable(split1.process());//小部分执行操作
new Runnable(split2.process());
List revisedList = split1 + split2;//将结果合并
로그인 후 복사

大家对hadoop有稍微了解就知道,里面的 MapReduce 本身就是用于并行处理大数据集的软件框架,其 处理大数据的核心思想就是大而化小,分配到不同机器去运行map,最终通过reduce将所有机器的结果结合起来得到一个最终结果,与MapReduce不同,Stream则是利用多核技术可将大数据通过多核并行处理,而MapReduce则可以分布式的。

3.2.2顺序与并行性能测试对比

如果是多核机器,理论上并行流则会比顺序流快上一倍,下面是测试代码


long t0 = System.nanoTime();

  //初始化一个范围100万整数流,求能被2整除的数字,toArray()是终点方法

  int a[]=IntStream.range(0, 1_000_000).filter(p -> p % 2==0).toArray();

  long t1 = System.nanoTime();

  //和上面功能一样,这里是用并行流来计算

  int b[]=IntStream.range(0, 1_000_000).parallel().filter(p -> p % 2==0).toArray();

  long t2 = System.nanoTime();

  //我本机的结果是serial: 0.06s, parallel 0.02s,证明并行流确实比顺序流快

  System.out.printf("serial: %.2fs, parallel %.2fs%n", (t1 - t0) * 1e-9, (t2 - t1) * 1e-9);
로그인 후 복사

3.3关于Folk/Join框架

应用硬件的并行性在java 7就有了,那就是 java.util.concurrent 包的新增功能之一是一个 fork-join 风格的并行分解框架,同样也很强大高效,有兴趣的同学去研究,这里不详谈了,相比Stream.parallel()这种方式,我更倾向于后者。

4.总结

如果没有lambda,Stream用起来相当别扭,他会产生大量的匿名内部类,比如上面的3.1.2map例子,如果没有default method,集合框架更改势必会引起大量的改动,所以lambda+default method使得jdk库更加强大,以及灵活,Stream以及集合框架的改进便是最好的证明。

위 내용은 Java8의 새로운 기능인 람다의 역할을 해석합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

노흡의 기능 및 원리 분석 노흡의 기능 및 원리 분석 Mar 25, 2024 pm 03:24 PM

nohup의 역할과 원리 분석 nohup은 유닉스 및 유닉스 계열 운영체제에서 사용자가 현재 세션을 종료하거나 터미널 창을 닫아도 백그라운드에서 명령을 실행하는 데 일반적으로 사용되는 명령입니다. 아직도 계속 처형되고 있다. 이번 글에서는 nohup 명령의 기능과 원리를 자세히 분석해보겠습니다. 1. nohup의 역할: 백그라운드에서 명령 실행: nohup 명령을 통해 사용자가 터미널 세션을 종료해도 영향을 받지 않고 장기 실행 명령이 백그라운드에서 계속 실행되도록 할 수 있습니다. 이건 실행해야 해

Win11 시스템에서 파일 접미사를 표시하는 방법은 무엇입니까? 상세한 해석 Win11 시스템에서 파일 접미사를 표시하는 방법은 무엇입니까? 상세한 해석 Mar 09, 2024 am 08:24 AM

Win11 시스템에서 파일 접미사를 표시하는 방법은 무엇입니까? 자세한 설명: Windows 11 운영 체제에서 파일 접미사는 파일 이름 뒤의 점과 그 뒤의 문자를 말하며 파일 형식을 나타내는 데 사용됩니다. 기본적으로 Windows 11 시스템에서는 파일의 접미사를 숨겨서 파일 탐색기에서 파일 이름만 볼 수 있고 파일 형식을 직관적으로 파악할 수 없습니다. 그러나 일부 사용자의 경우 파일 형식을 더 잘 식별하고 관련 작업을 수행하는 데 도움이 되므로 파일 접미사를 표시해야 합니다.

Linux DTS의 역할과 사용법 이해 Linux DTS의 역할과 사용법 이해 Mar 01, 2024 am 10:42 AM

LinuxDTS의 역할 및 사용법 이해 임베디드 Linux 시스템 개발에서 장치 트리(DeviceTree, 줄여서 DTS)는 시스템의 하드웨어 장치와 연결 관계 및 속성을 설명하는 데이터 구조입니다. 장치 트리를 사용하면 Linux 커널을 수정하지 않고도 다양한 하드웨어 플랫폼에서 유연하게 실행할 수 있습니다. 본 글에서는 LinuxDTS의 기능과 사용법을 소개하고, 독자의 이해를 돕기 위해 구체적인 코드 예제를 제공합니다. 1. 디바이스 트리 디바이스 트리의 역할

PHP에서 정의 함수의 중요성과 역할 살펴보기 PHP에서 정의 함수의 중요성과 역할 살펴보기 Mar 19, 2024 pm 12:12 PM

PHP에서 정의 함수의 중요성과 역할 1. 정의 함수에 대한 기본 소개 PHP에서 정의 함수는 상수를 정의하는 데 사용되는 핵심 함수입니다. 상수는 프로그램 실행 중에 값을 변경하지 않습니다. 정의 함수를 사용하여 정의된 상수는 스크립트 전체에서 액세스할 수 있으며 전역적입니다. 2. 정의 함수의 구문 정의 함수의 기본 구문은 다음과 같습니다: Define("상수 이름","상수 값&qu

PHP는 어떤 용도로 사용되나요? PHP의 역할과 기능 살펴보기 PHP는 어떤 용도로 사용되나요? PHP의 역할과 기능 살펴보기 Mar 24, 2024 am 11:39 AM

PHP는 웹 개발에 널리 사용되는 서버 측 스크립팅 언어입니다. 주요 기능은 HTML과 결합하면 풍부하고 다채로운 웹 페이지를 생성할 수 있습니다. PHP는 강력하며 다양한 데이터베이스 작업, 파일 작업, 양식 처리 및 기타 작업을 수행하여 웹 사이트에 강력한 상호 작용과 기능을 제공합니다. 다음 기사에서는 자세한 코드 예제를 통해 PHP의 역할과 기능을 자세히 살펴보겠습니다. 먼저, PHP의 일반적인 용도를 살펴보겠습니다: 동적 웹 페이지 생성: P

Golang에 클래스와 유사한 객체지향 기능이 있나요? Golang에 클래스와 유사한 객체지향 기능이 있나요? Mar 19, 2024 pm 02:51 PM

Golang(Go 언어)에는 전통적인 의미의 클래스 개념이 없지만, 클래스와 유사한 객체지향 기능을 구현할 수 있는 구조체라는 데이터 형식을 제공합니다. 이 기사에서는 구조를 사용하여 객체 지향 기능을 구현하는 방법을 설명하고 특정 코드 예제를 제공합니다. 구조의 정의와 사용법 먼저 구조의 정의와 사용법을 살펴보자. Golang에서는 type 키워드를 통해 구조를 정의한 다음 필요한 곳에 사용할 수 있습니다. 구조에는 속성이 포함될 수 있습니다.

리눅스 Bashrc란 무엇입니까? 상세한 해석 리눅스 Bashrc란 무엇입니까? 상세한 해석 Mar 20, 2024 pm 09:18 PM

LinuxBashrc는 Linux 시스템의 구성 파일로, 사용자의 Bash(BourneAgainShell) 환경을 설정하는 데 사용됩니다. Bashrc 파일에는 사용자 로그인에 필요한 환경 변수, 시작 스크립트 등의 정보가 저장되며, 사용자의 Shell 환경을 맞춤 설정할 수 있습니다. Linux 시스템에서 각 사용자는 해당 Bashrc 파일을 가지며, 이 파일은 사용자 홈 디렉터리의 숨겨진 폴더에 있습니다. Bashrc 파일의 주요 기능은 다음과 같습니다. 환경 설정

암호화 GPT란 무엇입니까? 3EX의 Crypto GPT가 통화계의 새로운 입구인 이유는 무엇입니까? 암호화 GPT란 무엇입니까? 3EX의 Crypto GPT가 통화계의 새로운 입구인 이유는 무엇입니까? Jul 16, 2024 pm 04:51 PM

CryptoGPT란 무엇입니까? 3EX의 CryptoGPT가 화폐계의 새로운 입구라고 불리는 이유는 무엇입니까? 7월 5일 뉴스에 따르면 3EXAI 거래 플랫폼은 글로벌 암호화폐 투자자에게 포괄적이고 지능적인 정보 쿼리 및 AI 투자 조언을 제공하는 것을 목표로 AI 기술과 빅데이터를 기반으로 한 혁신적인 프로젝트인 CryptoGPT를 공식 출시했습니다. CryptoGPT는 CoinMarketCap의 상위 200개 코인과 수백 개의 고품질 프로젝트 파티 정보를 포함했으며 계속 확장할 계획입니다. CryptoGPT를 통해 사용자는 상세한 거래 컨설팅 보고서와 AI 투자 조언을 무료로 얻을 수 있으며, 정보 컨설팅 서비스부터 지능적인 전략 수립 및 거래 자동 실행까지 풀스택 폐쇄 루프를 실현할 수 있습니다. 현재 서비스는 무료입니다. 필요

See all articles