자료의 흐름, 데이터뭉치(콜렉션 자료)
중간연산만 하고 최종연산을 안하면 결과가 안나온다.
- 중간연산
filter: 조건에 맞는 자료들 추출하기
map: 자료를 특정한 형태로 변환하기(예: 문자열 → 문자열의 길이)
sorted(): 정렬
distinct(): 중복제거
limit(): 스트림 범위 제한
skip(): 스트림 내 데이터들 중 앞에서 n개 요소 건너 뜀
등등- 최종연산
collect(): 콜렉션 자료 만들어 반환
forEach(): 각 요소에 대한 작업 수행
count(): 요소 갯수 반환
reduce(): 요소들을 하나의 결과로 만들기
anyMatch(), allMatch(): 조건 검사
등등
package ex0418;
import java.util.Arrays;
import java.util.List;
public class StreamSortedTest {
public static void main(String[] args) {
List<String> list = Arrays.asList("홍길동","멸린","해리포터");
list.stream()
.sorted() // 정렬 후 출력
.forEach(n->System.out.print(n+"\t"));
System.out.println();
list.stream()
.sorted((s1,s2) ->s2.length() - s1.length()) // 길이별 내림차순
.forEach(n->System.out.print(n+"\t"));
}
}
List<String> list = Arrays.asList("apple","banana","orange");
list.stream()
.map(s->s.toUpperCase()) //대문자로 변환
.forEach(n->System.out.print(n+"\t"));
코드를 입력하세요
List<String> list = Arrays.asList("apple","anana","orange");
// 단어들을 대문자로 변환하여 출력
list.stream()
.map(s->s.toUpperCase()) //대문자로 변환
.forEach(n->System.out.print(n+"\t"));
System.out.println();
// 문자열의 길이가 5보다 큰 단어만 출력하기
list.stream()
.filter(s->s.length()>5)
.map(s->s.toUpperCase()) //대문자로 변환
.forEach(n->System.out.print(n+"\t"));
System.out.println();
// banana에서 b지우기
list.stream()
.filter(s->s.startsWith("b"))
.map(s->s.replace("b", ""))
.forEach(s->System.out.print(s+"\t"));
System.out.println();
// banana에서 b지우고 a로 시작하면 단어 대문자로 출력하기
list.stream()
.filter(s->s.startsWith("b"))
.map(s->s.replace("b", ""))
.filter(s->s.startsWith("a"))
.map(s->s.toUpperCase())
.forEach(s->System.out.print(s+"\t"));
System.out.println();
// e로 끝나는 단어만 대문자로 출력
list.stream()
.filter(s->s.endsWith("e"))
.map(s->s.toUpperCase())
.forEach(s->System.out.print(s+"\t"));
int sum = IntStream.of(1,3,5,7,9).sum();
System.out.println("sum: "+sum);
long count = IntStream.of(1,3,5,7,9).count();
System.out.println("count: "+count);
reduce(초기기준값, 비교대상값)
List<String> list = Arrays.asList("홍길동","전우치","손오공");
String name = list.stream()
.reduce("이순신", (s1,s2)-> (s1.length() >= s2.length()) ? s1:s2);
System.out.println(name);
결과: 이순신
List<String> list = Arrays.asList("홍길동","전우치","손오공","해리포터");
String name = list.stream()
.reduce("이순신", (s1,s2)-> (s1.length() >= s2.length()) ? s1:s2);
System.out.println(name);
결과: 해리포터
조건? 참 : 거짓;
List<Integer> numbers = List.of(10,20,30,40,50,60,70);
numbers.stream()
.skip(2)
.limit(3)
.forEach(System.out::println); // 메서드참조
결과
30
40
50
List<Integer> result = numbers.stream()
.skip(2)
.limit(3)
.collect(Collectors.toList());
System.out.println(result);
int i = results.stream()
.reduce(0, (a,b) -> a+b);
System.out.println(i);
결과
[30, 40, 50]
120

List<String> words = List.of("hello","hi","world");
boolean result = words.stream()
.anyMatch(s->s.length() < 3); // 길이가 3 미만인 단어가 있나?
System.out.println(result==true? "Yes":"No");
boolean result2 = words.stream()
.allMatch(s->s.length() < 3); // 조건을 모두 만족하나?
System.out.println(result2==true? "Yes":"No");
결과
Yes
No
File file = new File("C:/temp/jv_test/test.txt");
if(file.exists()) {
System.out.println("파일이름: "+file.getName());
System.out.println("절대경로: "+file.getAbsolutePath());
System.out.println("파일크기: "+file.lastModified()+"bytes");
}else {
System.out.println("파일이 존재하지 않습니다.");
}
결과
File file2 = new File("C:/temp/jv_test/test.txt");
try {
if(file2.createNewFile()) { // 파일생성 결과 t/f
System.out.println("파일이 생성되었습니다."+file2.getName());
}else {
System.out.println("파일이 이미 존재합니다.");
}
}catch(IOException e) {
System.out.println("파일 생성 중 문제가 발생했습니다.");
e.printStackTrace();
}
결과1(파일이 없는 상태에서 한 번 실행)
파일이 존재하지 않습니다.
파일이 생성되었습니다.test.txt
결과2(파일이 생성되고 또 실행)
파일이름: test.txt
절대경로: C:\temp\jv_test\test.txt
파일크기: 1744940862965bytes
파일이 이미 존재합니다.
try {
FileWriter fw = new FileWriter("C:/temp/jv_test/test1.txt");
fw.write("Hello, Java File I/O를 연습중입니다.");
fw.close(); // DB의 commit과 같은 것
System.out.println("파일에 문자열을 성공적으로 썼습니다.");
}catch(IOException e){
e.printStackTrace();
}
해당 경로에 test1.txt 파일이 있으면 그곳에 해당 내용을 작성, 없으면 생성 후 작성
fw = new FileWriter("C:/temp/jv_test/test.txt",true);
fw.write("\n이어서 씁니다. Hello, Java File I/O를 연습중입니다.2\n");
fw.close();
System.out.println("");
test.txt에 이어서 내용이 작성된다.
true하면 이어쓰기
Hello, Java File I/O를 연습중입니다.
이어서 씁니다. Hello, Java File I/O를 연습중입니다.2
true가 없으면 덮어쓰기
이어서 씁니다. Hello, Java File I/O를 연습중입니다.2
파일 끝이 아니라면 한 숫자(→글자)씩 출력
파일의 끝을 -1로 표현해두었음.
try {
FileReader fr = new FileReader("C:/temp/jv_test/test.txt");
int data = 0;
while((data=fr.read()) != -1) { // EoF: -1이 끝이다.
System.out.print((char)data);
}
fr.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
결과
Hello, Java File I/O를 연습중입니다.
이어서 씁니다. Hello, Java File I/O를 연습중입니다.2
파일의 끝을 -1로 표현해두었음.
FileReader fr = new FileReader("C:/temp/jv_test/test.txt");
int data = 0;
System.out.println(fr.read());
System.out.println(fr.read());
System.out.println(fr.read());
위 처럼 fr.read()값만 세번 출력했을 때, 72, 101, 108이 출력되는데 이것은 ascii코드 H, e, l 이 된다.
그래서 char로 형변환해서 출력해주면 우리가 볼 수 있는 문자로 출력된다.
Buffered로 파일을 readLine()하면 문장 단위로 읽음. (문장의 처음부터 Enter키가 있는 지점까지)
문장이 더 이상 없으면 null을 반환
FileReader fr = new FileReader("C:/temp/jv_test/test.txt");
BufferedReader br = new BufferedReader(fr);
System.out.println("버퍼 사용하기");
String s = null;
while((s=br.readLine()) != null) {
System.out.println(s);
}
결과
버퍼 사용하기
Hello, Java File I/O를 연습중입니다.
이어서 씁니다. Hello, Java File I/O를 연습중입니다.2
버퍼 → 보조스트림 이라고도 함
System.out.println("---START---");
try{// 해야할 일(기능)
String s = null;
System.out.println(s.charAt(0));
}catch(NullPointerException e){
// 문제가 생기면 문제가 생겼다고 알려주고 프로그램은 지속되어야 한다.
System.out.println("---END---");
}
결과
---START---
---END---
try ~ catch를 해주지 않으면
---START--- 만 출력되고 프로그램이 중단된다.(완전 끝나지 않은 상태)
System.out.println("---START---");
try{// 해야할 일(기능)
String s = "abc";
System.out.println(s.charAt(0));
}catch(NullPointerException e){
// 문제가 생기면 문제가 생겼다고 알려주고 프로그램은 지속되어야 한다.
System.out.println("---s에 문자열이 담겨있지 않아요---");
}finally {
// try의 결과가 정상 or 비정상 상관없이 무조건 하는 기능
System.out.println("반드시 해야할 일을 하자.");
}
System.out.println("---END---");
결과
---START---
a
반드시 해야할 일을 하자.
---END---
br.close();나 fr.close();와 같이 반드시 종료해줘야하는 것들을 작성해줄 수 있다.
단 try ~ catch ~ fianlly에서 br.close()나 fr.close()를 사용하기 위해서는 try~catch~finally 밖에서 선언해주어야 한다.(전역 or 멤버)
package ex0418;
public class FinallyTest {
static String s; // 전역변수로 선언해준다.
public static void main(String[] args) {
System.out.println("---START---");
try{// 해야할 일(기능)
s = "abc";
System.out.println(s.charAt(0));
}catch(NullPointerException e){
// 문제가 생기면 문제가 생겼다고 알려주고 프로그램은 지속되어야 한다.
System.out.println(s+"에 문자열이 담겨있지 않아요");
}finally {
// try의 결과가 정상 or 비정상 상관없이 무조건 하는 기능
System.out.println(s+" 반드시 해야할 일을 하자.");
}
System.out.println("---END---");
}
}
해결 필요
일기를 쓸 때(새로, 추가) 문장을 입력하고 싶은데 어떻게 해야하나..
package ex0418;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class DiaryTest {
static Scanner sc = new Scanner(System.in);
static FileWriter fw;
public static void main(String[] args) {
int i;
boolean flag=true;
while(flag) {
printMenu();
i = sc.nextInt();
switch(i) {
case 1: writeDiary(); break;
case 2: readDiary(); break;
case 3: System.out.println("종료합니다."); flag = false; break;
default: System.out.println("메뉴를 다시 선택하세요.");
}
}
}
public static void printMenu() {
System.out.println("===== MENU =====");
System.out.println("1. 일기 쓰기");
System.out.println("2. 일기 읽기");
System.out.println("3. 종료");
System.out.println("---------------");
System.out.print("메뉴 선택 > ");
}
public static void writeDiary() {
System.out.println("-----일기 쓰기-----");
System.out.println("1. 새 일기 쓰기");
System.out.println("2. 기존 일기 이어쓰기");
System.out.println("3. 메인 메뉴로 가기");
System.out.print("메뉴 선택 > ");
int i = sc.nextInt();
switch(i) {
case 1: writeNewDiary(); break;
case 2: writeContinueDiary(); break;
case 3: break;
default: System.out.println("메뉴를 다시 선택하세요."); break;
}
}
public static void writeNewDiary() {
System.out.print("[새 일기] 일기 제목 > ");
String title = sc.next();
try {
fw = new FileWriter("C:/temp/jv_test/"+title+".txt");
System.out.print("[새 일기] 일기 내용 > ");
String content = sc.next();
fw.write(content);
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void writeContinueDiary() {
System.out.print("[일기 이어쓰기] 일기 제목 > ");
String title = sc.next();
System.out.print("[일기 이어쓰기] 추가 내용 > ");
String content = sc.next();
try {
fw = new FileWriter("C:/temp/jv_test/"+title+".txt",true);
fw.write("\n"+content);
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void readDiary() {
String title = null;
File dir = new File("C:/temp/jv_test/");
File[] files = dir.listFiles();
List<String> list = new ArrayList<>();
for(int i=0; i<files.length; i++) {
list.add(files[i].getName());
}
System.out.println("-----일기 목록-----");
list.stream()
.filter(s->s.endsWith(".txt"))
.map(s->s.replace(".txt", ""))
.forEach(s->System.out.println(s));
System.out.println("-----------------");
System.out.print("읽고 싶은 일기 제목 > ");
try {
title = sc.next();
FileReader fr = new FileReader("C:/temp/jv_test/"+title+".txt");
BufferedReader br = new BufferedReader(fr);
String s = null;
while( (s=br.readLine()) != null) {
System.out.println(s);
}
} catch (FileNotFoundException e) {
System.out.println(title +" 제목을 가진 일기는 없습니다.");
//e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}