Java8의 Lambda 및 Stream에 대한 자세한 설명(코드 포함)
이 기사는 Java8의 Lambda 및 Stream(코드 포함)에 대한 자세한 설명을 제공합니다. 이는 특정 참조 가치가 있으므로 도움이 될 수 있습니다.
1. 소개
이 기사에서는 주로 Java8의 두 가지 주요 새로운 기능인 람다 표현식과 Stream API를 소개합니다. 이 두 기능은 더 높은 수준의 추상화를 제공하고 개발을 단순화하며 생산 효율성을 향상시킵니다.
2. 람다 표현식
2.1 람다 표현식 첫 소개
스레드를 생성하고 Runnable
익명 내부 클래스를 사용하세요Runnable
匿名内部类
Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("Hello Aron."); } });
看着问题不大,实际上弊端挺明显:模板语法太多,真正有业务意义的的语句只有System.out.println("Hello Aron.")
,因为如此,也严重干扰了我们阅读代码。
引入lambda表达式后,则可以这么写
Thread thread = new Thread(() -> System.out.println("Hello Aron."));
简洁了太多,有木有?
2.2 更多Lambda表达式
Runnable runnable = () -> System.out.println("Hello World."); Consumer<T> tConsumer = bean -> System.out.println("Hello World."); Runnable runnable1 = () -> { System.out.println("Hello World."); System.out.println("Hello World."); };
语法分为3段式:参数 、->
以及语句,即(...)-> { ...}
ArrayList<Java8Test> list = new ArrayList<>();
System.out.println("Hello Aron.")
입니다. 또한 코드를 읽는 데 심각한 방해가 됩니다. 람다 표현식을 소개하고 나면 이렇게 쓰면 됩니다
BinaryOperator<Long> addLongs = (x, y) -> x + y;
Stream<String> StrStream = Stream.of("a", "b");
->
및 명령문, 즉 (...)-> /code>
2.3 함수 인터페이스
Java는 강력한 유형의 언어이며 메소드 매개변수에는 고정된 유형이 있습니다. 따라서 문제는 람다 표현식을 코드 조각 묶음으로 간주하면 이 의도도 당분간은 기능적 인터페이스로 이해할 수 있다는 것입니다.
프로그래밍 과정에서 항상 많은 기능적 인터페이스를 접하게 됩니다. 다음은 JDK에서 가장 중요한 기능적 인터페이스 중 일부입니다.
인터페이스 매개변수 반환 유형의 예
Interface
Parameters 반환 유형 Examples
Predicate T boolean 은 "Hello"와 동일합니까?
소비자 < 공급자 None T Factory MethodUnaryOperator T T 논리적 NOT(!)BinaryOperator< ;T> (T, T)
T 두 숫자의 합(+)을 구하세요
2.4 类型推断
先看一段熟悉的集合代码
ArrayList<Java8Test> list = new ArrayList<>();
로그인 후 복사로그인 후 복사
在ArrayList中申明了存储的元素的类型,于是在ArrayList<>()这里的类型可以缺省,编译器可以根据左侧(即上文)推断出来。
同理,在lambda表达式也是一样的。
BinaryOperator<Long> addLongs = (x, y) -> x + y;
로그인 후 복사로그인 후 복사
在上面的表达 式中,我们注意到 (x, y)
这里是没有申明方法的参数类型的,却能执行数学运算 +
。
这里根据函数接口指定的泛型类为Long
,即可推断方法的参数为Long
,然后执行x + y
。
2.5 Lambda小结
Lambda表达式是一个匿名方法,简化了匿名内部类的写法,把模板语法屏蔽,突出业务语句,传达的更像一种行为。
Lambda表达式是有类型的,JDK内置了众多函数接口
Lambda的3段式结构:(...)-> { ...}
3. Stream 流
3.1 简介
流(Stream)是Java8的新特性,是一种使程序员得以站在更高的抽象层次上对集合进行操作。在思路上,类似于SQL的存储过程,有几个步骤:
先定义一些操作的集合,注意:这里只定义,不真正执行
触发执行,获取结果
对结果进一步处理,筛选、打印、使用
其中,第1步的定义操作叫惰性求值,给你套路(返回Stream
),但是不会执行返回结果。
第2步的触发操作叫及早求值,这个人说干就干,立马要结果(返回结果数据)。
第3步的筛选类似SQL的where
子句,对结果进一步的筛选。
3.2 Stream API
Stream
类位于java.util.stream
包,是Java8核心的类之一,拥有众多方法,下面罗列了一些比较重要的方法进行讲解。更多的是抛砖引玉,任何教程都比不上自己的悟性来得爽快,先找点感觉,先掌握基本用法尝试使用起来,慢慢自然就会了。
3.2.1 Stream.of(T… t)
要使用Stream
,那就必须得先创建一个String
类型的Stream
Stream<String> StrStream = Stream.of("a", "b");
로그인 후 복사로그인 후 복사
3.2.2 Stream.collect(Collector super T, A, R> collector)
使用收集器Collector
将StrStream
转化为熟悉的集合Collection
List<String> collect = StrStream.collect(Collectors.toList());
로그인 후 복사
3.2.2 Stream.map(Function super T, ? extends R> mapper)
所谓map,从字面理解就是映射。这里指的是对象关系的映射,
比如从对象集合映射到属性结合:
List<String> names = Stream.of(new Student("zhangSan"), new Student("liSi"))
.map(student -> student.getName())
.collect(toList());
로그인 후 복사
从小写字母映射到大写字母:
List<String> collected = Stream.of("a", "b", "hello")
.map(string -> string.toUpperCase())
.collect(toList());
로그인 후 복사
将 字符串流 根据空格分割成 字符串数组流
Stream<String> stringStream = Stream.of("Hello Aron.");
Stream<String[]> stringArrayStream = stringStream.map(word -> word.split(" "));
로그인 후 복사
3.2.3 Stream.filter(Predicate super T> predicate)
filter
顾名思义,过滤筛选。这里的参数函数接口是一个条件,筛选出满足条件的元素
// 筛选年龄大于19的学生
List<Student> stu = Stream.of(new Student("zhangSan", 19), new Student("liSi"), 20)
.filter(student -> student.getAge() > 19)
.collect(toList());
로그인 후 복사
3.2.4 Stream.flatMap(Function super T, ? extends Stream extends R>> mapper)
flatMap
扁平化映射,即将数据元素为数组的Stream
转化为单个元素
Stream<String> stringStream = Stream.of("Hello Aron.");
// 返回值为数组
Stream<String[]> stringArrayStream = stringStream.map(word -> word.split(" "));
// flatMap扁平化映射后,元素都合并了
Stream<String> flatResult = stringArrayStream.flatMap(arr -> Arrays.stream(arr))
로그인 후 복사
3.2.5 Stream.max(Comparator super T> comparator)
max
即最大,类似SQL
中的函数max()
,从数据中根据一定的条件筛选出最值
// 筛选年龄最大/小的学生
Stream<Student> studentStream = Stream.of(new Student("zhangSam", 19), new Student("liSi", 20));
Optional<Student> max = studentStream.max(Comparator.comparing(student -> student.getAge()));
// Optional<Student> max = studentStream.min(Comparator.comparing(student -> student.getAge()));
// 年龄最大/小的学生
Student student = max.get();
로그인 후 복사
3.2.7 Sream.reduce(T identity, BinaryOperator binaryOperator)
reduce
操作实现从一组值中生成一个值,上面的max
、min
实际上都是reduce
操作。
参数Identity
表示初始值,
参数binaryOperator
是一个函数接口,表示二元操作,可用于数学运算
// 使用reduce() 求和 (不推荐生产环境使用)
int count = Stream.of(1, 2, 3).reduce(0, (acc, element) -> acc + element);
로그인 후 복사
上面代码,展开reduce()
操作
BinaryOperator<Integer> accumulator = (acc, element) -> acc + element;
int count = accumulator.apply( accumulator.apply(accumulator.apply(0, 1),2), 3);
로그인 후 복사
3.2.8 综合操作
// 查找所有姓张的同学并按字典顺序排序,存储到list
List<Student> newList = studentList.Stream()
.filter(student -> student.getName().startsWith("张"))
.sorted(Comparator.comparing(student -> student.getName())
.collect(toList());
로그인 후 복사
위 내용은 Java8의 Lambda 및 Stream에 대한 자세한 설명(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











C++에는 Lambda 표현식을 사용하여 예외를 처리하는 두 가지 방법이 있습니다. 즉, try-catch 블록을 사용하여 예외를 포착하고, catch 블록에서 예외를 처리하거나 다시 발생시킵니다. std::function 유형의 래퍼 함수를 사용하면 try_emplace 메서드가 Lambda 표현식에서 예외를 포착할 수 있습니다.

Java8은 1년 전 날짜를 계산하기 위해 minus() 메소드를 사용하여 1년 전 또는 1년 후 날짜를 계산합니다. packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUni

C++에서 클로저는 외부 변수에 액세스할 수 있는 람다 식입니다. 클로저를 생성하려면 람다 표현식에서 외부 변수를 캡처하세요. 클로저는 재사용성, 정보 숨기기, 지연 평가와 같은 이점을 제공합니다. 이는 클로저가 외부 변수가 파괴되더라도 여전히 접근할 수 있는 이벤트 핸들러와 같은 실제 상황에서 유용합니다.

C++ 다중 스레드 프로그래밍에서 람다 식의 장점에는 단순성, 유연성, 매개 변수 전달 용이성 및 병렬성이 포함됩니다. 실제 사례: 람다 식을 사용하여 다중 스레드를 만들고 다른 스레드에서 스레드 ID를 인쇄하여 이 방법의 단순성과 사용 용이성을 보여줍니다.

C++ Lambda 표현식은 함수 범위 변수를 저장하고 함수에 액세스할 수 있도록 하는 클로저를 지원합니다. 구문은 [캡처 목록](매개변수)->return-type{function-body}입니다. 캡처 목록은 캡처할 변수를 정의합니다. [=]를 사용하여 모든 지역 변수를 값으로 캡처하고, [&]를 사용하여 모든 지역 변수를 참조로 캡처하거나, [변수1, 변수2,...]를 사용하여 특정 변수를 캡처할 수 있습니다. 람다 표현식은 캡처된 변수에만 액세스할 수 있지만 원래 값을 수정할 수는 없습니다.

스트림 작업은 Java8의 하이라이트입니다! java.util.stream은 매우 강력하지만 실제 작업에서 이를 거의 사용하지 않는 개발자가 여전히 많습니다. 가장 불만이 많은 이유 중 하나는 스트리밍 작업과 같은 작업이 초기에는 실제로 그랬기 때문입니다. DEBUG에서는 스트림을 사용할 수 없기 때문에 한 줄의 코드일 경우 다음 단계로 넘어갈 때 실제로는 많은 작업이 한꺼번에 전달되기 때문에 어느 줄이 문제인지 판단하기 어렵습니다. 플러그인: JavaStreamDebugger 사용 중인 IDEA 버전이 비교적 새로운 버전인 경우 이 플러그인은 이미 포함되어 있으므로 설치할 필요가 없습니다. 아직 설치되지 않은 경우 수동으로 설치한 후 아래 단계를 계속 진행하세요.

C++에서 외부 변수의 람다 식을 캡처하는 방법에는 세 가지가 있습니다. 값으로 캡처: 변수의 복사본을 만듭니다. 참조로 캡처: 변수 참조를 가져옵니다. 값 및 참조로 동시에 캡처: 값 또는 참조로 여러 변수를 캡처할 수 있습니다.

java8의 스트림은 maxpublicstaticvoidmain(String[]args){Listlist=Arrays.asList(1,2,3,4,5,6);Integermax=list.stream().max((a,b)->{if ( a>b){return1;}elsereturn-1;}).get();System.out.println(max);}참고: 여기서 크기는 양수, 음수 및 0 값을 통해 결정됩니다. if(a>b){returna;}elseretur를 직접 작성하는 대신
