YJ의 새벽
JAVA ( 스트림 ) 본문
- 스트림 ??
--다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것.
***스트림만들기 -> 중간연산 (여러번 가능) -> 최종연산 (1번)
중간연산 : 연산결과가 스트림인 연산. 반복적 사용가능.
최종연산 : 연산결과가 스트림이 아닌 연산. 단 한번만 적용가능. (스트림요소 소모)
ex )))
stream. distinct(). limit(5) . sorted() . forEach (System.out :: println)
중 간 연 산 최종연산
--스트림은 데이터 소스로부터 데이터를 읽기만 할뿐, 변경하지않는다.
--스트림은 Iterator 처럼 일회용이다.
--최종연산 전까지 중간연산이 수행되지 않는다. --지연된 연산.
--스트림은 작업을 내부 반복으로 처리한다.
--스트림의 작업을 병렬로 처리 --병렬스트림 (parallel() ) 을 지원. : 멀티쓰레드
- 스트림 만들기
--Collection 인터페이스의 stream() 으로 컬렉션을 스트림으로 변환.
( List, Set )
public class Example6 {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream(); // list를 Stream으로 변환
intStream.forEach(System.out :: print); // forEach() 최종연산
// Stream 은 1회용. 최종연산을 수행하면 Stream이 닫힌다.
intStream = list.stream(); //list로부터 Stream 생성해야
intStream.forEach(System.out :: print); //다시 최종연산을 할수있다.
}
}
- 스트림 만들기 ( 배열 )
기본형스트림 = int [] intArr = {1,2,3,4,5}
IntStream intStream = Arrays.stream (intArr)
객체 스트림 = Integer[] intArr = {1,2,3,4,5}
Stream<Integer> intStream = Arrays.stream (intArr)
public class Example6 {
public static void main(String[] args) {
//Stream<String> strStream = Stream.of(new String[] {"a","b","c"});
String[] strArr = {"a","b","c"};
Stream<String> strStream = Arrays.stream(strArr); //위에랑 같은문장
strStream.forEach(System.out :: println);
int[] intArr = {1,2,3,4,5};
IntStream intStream = Arrays.stream(intArr);
intStream.forEach(System.out :: print);
// System.out.println("sum="+intStream.sum()); // 기본형배열 스트림은
// System.out.println("avg="+intStream.average()); // sum, average 등등
// 가능하다.
// Integer[] intArr = {1,2,3,4,5};
// Stream<Integer> intStream = Arrays.stream(intArr); //객체스트림은
// intStream.forEach(System.out :: print); // sum, average 등
// System.out.println("count=" +intStream.count()); // 지원하지않는다.
}
}
- 스트림 만들기 ( 임의의 수 (난수 ) )
public class Example6 {
public static void main(String[] args) {
// IntStream intStream = new Random().ints(); //무한스트림.
// IntStream intStream = new Random().ints(5); // 5개만 뽑아라.
IntStream intStream = new Random().ints(10,5,10); // 10개뽑아라. 5부터 9까지
intStream
// .limit(10) // 10개만 자르기
.forEach(System.out :: println);
// iterator(T seed, UnaryOperator f) 단항 연산자
Stream<Integer> intStream2 = Stream.iterate(1, n -> n + 2); // 홀수 스트림
intStream2.limit(10).forEach(System.out :: println); // 홀수 10개만출력
// generate(Supplier s) : 주기만하는것, 입력X , 출력 O
Stream<Integer> intStream3 = Stream.generate(()->1); // 1 계속호출
intStream3.limit(10).forEach(System.out :: println); // 1 10개만 출력
}
}
- 스트림의 중간연산
--distinct() 중복을 제거
--filter(조건식) 조건에 안맞는 요소 제외
--limit() 스트림이 일부를 잘라낸다
--skip() 스트림의 일부를 건너뛴다
--peek() 스트림의 요소에 작업수행
--sorted() 스트림 요소 정렬
- 스트림의 최종연산
--forEach , forEachOrdered 각 요소 지정된 작업 수행
--count() 요소 개수 반환
--max, mix 최대값/최소값 반환
--findAny() 병렬 , filter랑 같이 쓰이며, 아무거나 하나 반환
--findFirst() 직렬, filter랑 같이 쓰이며,첫번째요소 반환
--allMatch(조건식) 조건식에 모두 만족하는지 . true/false
--anyMatch(조건식) 조건식에 하나라도 만족하는지
--noneMatch(조건식) 조건식에 모두 만족하지 않은지
--reduce 스트림의 요소를 하나씩 줄여가면서(리듀싱) 계산한다.
--collect 스트림의 요소를 수집.
EX )))) 스트림 중간연산 예제. ( 정렬 )
import java.util.Comparator;
import java.util.stream.Stream;
class Student implements Comparable<Student>{
String name;
int ban;
int totalScore;
Student(String name, int ban,int totalScore){
this.name = name;
this.ban = ban;
this.totalScore = totalScore;
}
@Override
public String toString() {
return name+", "+ban+", "+totalScore;
}
public String getName() {
return name;
}
public int getBan() {
return ban;
}
public int getTotalScore() {
return totalScore;
}
@Override
public int compareTo(Student s) { //총점 내림차순을 기본정렬로.
return s.totalScore - this.totalScore ;
}
}
public class Example6 {
public static void main(String[] args) {
Stream<Student> studentStream = Stream.of(
new Student("김철수", 3 , 300),
new Student("이철수", 1 , 200),
new Student("박철수", 2 , 100),
new Student("최철수", 2 , 150),
new Student("노철수", 1 , 200),
new Student("조철수", 3 , 290),
new Student("전철수", 3 , 180)
);
studentStream.sorted(Comparator.comparing(Student::getBan) // 1.반별로 정렬
.thenComparing(Comparator.naturalOrder())) // 2.기본정렬
.forEach(System.out::println);
}
}
EX )))) 스트림 중간연산 예제. ( map ) : Stream 타입변환
import java.io.File;
import java.util.stream.Stream;
public class Example6 {
public static void main(String[] args) {
File[] fileArr= { new File("Ex1.java"),
new File("Ex1.bak"),
new File("Ex2.java"),
new File("Ex1"),
new File("Ex1.txt")
};
Stream<File> fileStream = Stream.of(fileArr);
Stream<String> filenameStream = fileStream.map(File::getName);
// map() 으로 Stream<File> 을 Stream<String> 으로 변환.
filenameStream.forEach(System.out::println); // 파일이름 출력
fileStream = Stream.of(fileArr); //스트림 다시 생성
fileStream.map(File::getName) // <File> --> <String>
.filter( s -> s.indexOf('.') != -1 ) // 확장자가 없는것은 제외
.map( s -> s.substring(s.indexOf('.') +1 )) //확장자만 추출
.map( String :: toUpperCase ) // 모두 대문자변환
.distinct() //중복제거
.forEach( System.out :: println);
}
}
EX )))) 스트림 중간연산 예제. flatMap() : 스트림의 스트림을 스트림으로 변환.
import java.util.Arrays;
import java.util.stream.Stream;
public class Example6 {
public static void main(String[] args) {
Stream<String[]> strArrStrm = Stream.of(
new String[] {"abc","def","jkl"},
new String[] {"ABC","GHI","JKL"}
);
// Stream<Stream<String>> strStrmStrm = strArrStrm.map(Arrays::stream);
Stream<String> strStrm = strArrStrm.flatMap(Arrays :: stream);
// String배열이 합쳐짐
strStrm.map(String :: toLowerCase) //스트림과 요소들 모두 소문자로 변경
.distinct() //중복제거
.sorted() //정렬
.forEach(System.out :: println);
System.out.println();
String[] lineArr = {
"Believe or not It is ture",
"Do or do not There is no try", //한문장한문장 Stream으로 다루기
};
Stream<String> lineStream = Arrays.stream(lineArr);
lineStream.flatMap( line -> Stream.of(line.split(" +"))) //정규식. 하나이상의 공백
.map(String :: toLowerCase) //소문자로
.distinct() //중복제거
.sorted() //정렬
.forEach(System.out :: println);
}
}
EX )))) 스트림 최종연산 예제.
import java.util.Optional;
import java.util.OptionalInt;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class Example6 {
public static void main(String[] args) {
String[] strArr= {
"Inheritance","Java","Lambda","stream",
"OptionalDouble","IntStream","count","sum"
};
// Stream.of(strArr).forEach(System.out :: println);
Stream.of(strArr)
.parallel() // 병렬로 처리하는데 ( 순서 섞임 )
.forEachOrdered(System.out :: println); // 순서는 그대로 유지
boolean noEmptyStr = Stream.of(strArr).noneMatch( s -> s.length()==0);
// 문자열 길이가 0인게 하나도 없냐? true
Optional<String> sWord = Stream.of(strArr)
.filter( s -> s.charAt(0)=='s').findFirst();
// s 로 시작하는것중 처음꺼 찾기.
System.out.println("noEmptyStr=" + noEmptyStr);
System.out.println("sWord=" + sWord.get());
// Stream<String[]> 을 IntStream(기본형) 으로 변환
IntStream intStream1 = Stream.of(strArr).mapToInt(String :: length);
IntStream intStream2 = Stream.of(strArr).mapToInt(String :: length);
IntStream intStream3 = Stream.of(strArr).mapToInt(String :: length);
IntStream intStream4 = Stream.of(strArr).mapToInt(String :: length);
int count = intStream1.reduce( 0, (a,b) -> a + 1 ); //단어의 갯수
int sum = intStream2.reduce( 0, (a,b) -> a + b ); //단어의 길이
OptionalInt max = intStream3.reduce( Integer :: max );
OptionalInt min = intStream4.reduce( Integer :: min );
System.out.println("count=" + count);
System.out.println("sum=" + sum);
System.out.println("max=" + max.getAsInt()); //가장 긴 문자열
System.out.println("min=" + min.getAsInt()); //가장짧은 문자열
}
}
'SelfStudy > JAVA' 카테고리의 다른 글
JAVA 컬렉션 복습 (0) | 2023.04.06 |
---|---|
JAVA ( 스트림의 그룹화,분할 ) (0) | 2023.02.12 |
JAVA ( 메서드참조 ) (0) | 2023.02.09 |
JAVA ( 함수형인터페이스 ) (0) | 2023.02.09 |
JAVA ( 람다식 ) (0) | 2023.02.09 |