λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’»/JAVA

(39) [JAVA] 23일

by λ”°κΆˆ 2024. 4. 10.

 

 

λžŒλ‹€μ‹μ΄λž€?
λžŒλ‹€μ‹μ€ λ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ ν‘œν˜„ν•œ 것
객체 μ§€ν–₯ μ–Έμ–΄ λ³΄λ‹€λŠ” ν•¨μˆ˜ μ§€ν–₯ 언어에 가깝닀.
λ©”μ†Œλ“œλ₯Ό κ°„λž΅ν•˜λ©΄μ„œλ„ λͺ…ν™•ν•œ μ‹μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.
λ©”μ†Œλ“œλ₯Ό λžŒλ‹€μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ©”μ†Œλ“œμ˜ 이름 및 λ°˜ν™˜ 값이 μ—†μ–΄μ§€λ―€λ‘œ 읡λͺ… ν•¨μˆ˜ 라고도 ν•œλ‹€.
λžŒλ‹€μ‹μ˜ ν˜•νƒœλŠ” 맀개 λ³€μˆ˜λ₯Ό κ°€μ§„ μ½”λ“œ λΈ”λ‘μ΄μ§€λ§Œ λŸ°νƒ€μž„ μ‹œμ—λŠ” 읡λͺ… κ΅¬ν˜„ 객체λ₯Ό μƒμ„±ν•œλ‹€. 

 

 

 

슀트림(stream) μ΄λž€?
데이터 처리 연산을 μ§€μ›ν•˜λ„λ‘ μ†ŒμŠ€μ—μ„œ μΆ”μΆœλœ μ—°μ†λœ μš”μ†Œλ‘œ μ •μ˜ν•  수 μžˆλ‹€.
μ»¬λ ‰μ…˜κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μŠ€νŠΈλ¦Όμ€ νŠΉμ • μš”μ†Œ ν˜•μ‹μœΌλ‘œ 이루어진 μ—°μ†λœ κ°’ μ§‘ν•©μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•œλ‹€. 
μŠ€νŠΈλ¦Όμ€ μ»¬λ ‰μ…˜,λ°°μ—΄,I/O μžμ› λ“±μ˜ 데이터 제곡 μ†ŒμŠ€λ‘œλΆ€ν„° 데이터λ₯Ό μ†ŒλΉ„ν•œλ‹€.


package ch17.streamEx;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;

public class Ex01 {

	public static void main(String[] args) {
		List<String> list=Arrays.asList("A","B","C");
		
		Iterator<String> it= list.iterator();
		while(it.hasNext()) {
			String s=it.next();
			System.out.println(s);
		}
		System.out.println();
		
		Stream<String> stream=list.stream();
		stream.forEach(System.out::println); // λ©”μ†Œλ“œ μ°Έμ‘° 
		
	}
}

 

package ch17.lambdaEx;

public class Ex02 {

	public static void main(String[] args) {
		// λ§€κ°œλ³€μˆ˜κ°€ μ—†κ³  리턴 νƒ€μž…μ΄ void 인 λžŒλ‹€μ‹
		
		/*
		User2 u;
		u = () -> { System.out.println("λžŒλ‹€μ‹..."); };
		*/
		
		// User2 u =() -> { System.out.println("λžŒλ‹€μ‹..."); };
		
		User2 u =() -> System.out.println("λžŒλ‹€μ‹...");
		u.disp();
	}
}

interface User2 {
	public void disp();
}

 

package ch17.lambdaEx;

public class Ex03 {

	public static void main(String[] args) {
		// ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜μ™€ λ¦¬ν„΄νƒ€μž…μ΄ void 인 λžŒλ‹€μ‹
		// User3 u = (int a) -> { a+=10; System.out.println(a); };
		// User3 u = (a) -> { a+=10; System.out.println(a); };
		// User3 u = a -> { a+=10; System.out.println(a); };
		User3 u = a -> System.out.println(a+10);
		u.disp(10);
	}
}

interface User3 {
	public void disp(int a);
}
package ch17.lambdaEx;

public class Ex03 {

	public static void main(String[] args) {
		// ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜μ™€ λ¦¬ν„΄νƒ€μž…μ΄ void 인 λžŒλ‹€μ‹
		// User3 u = (int a) -> { a+=10; System.out.println(a); };
		// User3 u = (a) -> { a+=10; System.out.println(a); };
		// User3 u = a -> { a+=10; System.out.println(a); };
		User3 u = a -> System.out.println(a+10);
		u.disp(10);
	}
}

interface User3 {
	public void disp(int a);
}
package ch17.lambdaEx;

public class Ex04 {

	public static void main(String[] args) {
		// λ‘κ°œμ˜ λ§€κ°œλ³€μˆ˜, 리턴 νƒ€μž… 쑴재
		// User4 u = (a, b) -> { int c = a+b; return c; };
		// User4 u = (a, b) -> { return a+b;};
		User4 u = (a, b) -> a+b;
		
		int s = u.add(10, 5);
		System.out.println(s);
	}
}

@FunctionalInterface
interface User4 {
	public int add(int a, int b);
}
package ch17.lambdaEx;

public class Ex05 {
	public static void main(String[] args) {
		Test5 t = new Test5();
		t.using();
	}
}

interface User5 {
	public void disp();
}

class Test5 {
	int x = 10;
	
	class Demo {
		int y = 20;
		
		public void sub() {
			int a = 100;
			int b = 50;
			
			User5 u = () -> {
				System.out.println(this); 
					// λžŒλ‹€μ—μ„œμ˜ thisλŠ” 읡λͺ… 객체가 μ•„λ‹ˆλΌ λžŒλ‹€μ‹μ„ κ΅¬ν˜„ν•œ 클래슀
					// Test5$Demo@34ce8af7
				
				System.out.println(a);
				// System.out.println(y);
				System.out.println(this.y);
			};
			
			u.disp();
			
			// a = 200; // μ—λŸ¬. λžŒλ‹€μ‹μ—μ„œ μ‚¬μš©λœ λ‘œμ»¬λ³€μˆ˜λŠ” final 속성
			b = 100;
			System.out.println(a);
			System.out.println(b);
			
		}
	}
	
	public void using() {
		Demo obj = new Demo();
		obj.sub();
	}
}
package ch17.lambdaEx2;

public class Ex01 {

	public static void main(String[] args) {
		String s;
		
		// s = String.valueOf(100);
		
		// λžŒλ‹€μ‹
		Conversion c = n -> String.valueOf(100);
		s = c.convert(100);
		System.out.println(s);
		
		// λ©”μ†Œλ“œ μ°Έμ‘°
		//  : λ©”μ†Œλ“œλ₯Ό μ°Έμ‘°ν•˜μ—¬ λ§€κ°œλ³€μˆ˜μ˜ 정보 및 λ¦¬ν„΄νƒ€μž…μ„ μ•Œμ•„λ‚΄μ—¬
		//    λžŒλ‹€μ‹μ—μ„œ λΆˆν•„μš”ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ œκ±°ν•˜λŠ”λ° λͺ©μ μ΄ 있음
		Conversion c2 = String::valueOf;
		s = c2.convert(200);
		System.out.println(s);
		

	}

}

interface Conversion {
	public String convert(Integer n);
}
package ch17.lambdaEx2;

import java.util.function.Supplier;

public class Ex02 {

	public static void main(String[] args) {
		// Supplier : λ§€κ°œλ³€μˆ˜ μ—†κ³ , 리턴 κ°’ 쑴재
		
		// λžŒλ‹€μ‹
		Supplier<Object> o1 = () -> new Object();
		Object ob1 = o1.get();
		System.out.println(ob1);
		
		// μƒμ„±μž λ©”μ†Œλ“œ μ°Έμ‘°
		Supplier<Object> o2 = Object::new;
		Object ob2 = o2.get();
		System.out.println(ob2);

	}

}
package ch17.lambdaEx2;

import java.util.function.BiFunction;

public class Ex03 {

	public static void main(String[] args) {
		// BiFunction : λ‘κ°œμ˜ λ§€κ°œλ³€μˆ˜(T, R), 리턴값(R)
		BiFunction<String, String, Boolean> f1 = 
				(s1, s2) -> s1.equals(s2);
		Boolean b = f1.apply("java", "java");
		System.out.println(b);
		
		// μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ μ°Έμ‘°
		BiFunction<String, String, Boolean> f2 =
				String::equals;
		Boolean b2 = f2.apply("java", "java");
		System.out.println(b2);
	}

}

Optional

package ch17.optionalEx;

import java.util.Optional;

/*
   - Optional<T>
      : T νƒ€μž…μ˜ 객체λ₯Ό 포μž₯ν•΄μ£ΌλŠ” 래퍼 클래슀
   	  : λ³΅μž‘ν•œ 쑰건문 없이도 널(null) κ°’μœΌλ‘œ 인해 λ°œμƒν•˜λŠ” μ˜ˆμ™Έ 처리λ₯Ό ν•  수 μžˆλ‹€.
   	  
   - Optional 객체 생성 방법
     Optional.empty() : 빈 Optional 객체
     Optional.of(value) : value 값이 null이 μ•„λ‹Œ 경우.
                          null 이면 NullPointerException λ°œμƒ
     Optional.ofNullable(value) : value 값이 null인지 μ•„λ‹Œμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠλŠ” 경우
     
   - λ©”μ†Œλ“œ
     get() : Optional에 μ €μž₯된 κ°’ λ°˜ν™˜. null 이면 λŸ°νƒ€μž„  
     orElse(other) : null이 μ•„λ‹ˆλ©΄ κ·Έ 값을 λ°˜ν™˜ν•˜κ³  
                     null이면 other λ°˜ν™˜
     ifPresent(인자) : Optional 객체가 null이면 false 둜 아무것도 λ°˜ν™˜ν•˜μ§€ μ•ŠμŒ
			         null 이 μ•„λ‹ˆλ©΄ 인자λ₯Ό μ‹€ν–‰
     orElseGet(인자) : μ €μž₯된 값이 null이 μ•„λ‹ˆλ©΄ κ·Έ 값을 λ°˜ν™˜ν•˜κ³ 
                      null 이면 인자둜 μ „λ‹¬λœ 값을 λ°˜ν™˜
     map(mapper) : mapper ν•¨μˆ˜λ₯Ό 톡해 μž…λ ₯ 값을 λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€ν™˜
     orElseThrow(μ˜ˆμ™Έν΄λž˜μŠ€) : null 인경우 μ˜ˆμ™Έ 던짐                                         
*/

public class Ex01 {

	public static void main(String[] args) {
		// 빈 Optional 객체
		Optional<String> op = Optional.empty();
		System.out.println(op.orElse("빈객체"));
		// orElse(other) : null이 μ•„λ‹ˆλ©΄ κ·Έ 값을 λ°˜ν™˜ν•˜κ³  null이면 other λ°˜ν™˜
		
		Optional<String> op2 = Optional.of("123");
			// of(value) : value κ°€ null 이 μ•„λ‹Œ 경우 μ‚¬μš©
		String s = op2.get(); // Optional 객체에 μ €μž₯된 κ°’ λ°˜ν™˜
		System.out.println(s);
		
		int n = op2.filter(x->x.length()>0)
					.map(Integer::parseInt)
					.get();
		System.out.println(n);
		
		String str = null;
		Optional<String> op3 = Optional.ofNullable(str);
							// empty Optional 객체
		// System.out.println(op3.get()); //  λŸ°νƒ€μž„
		System.out.println(op3.orElse("빈객체"));
		
		str = "abc";
		Optional<String> op4 = Optional.ofNullable(str);
		// System.out.println(op4.get()); // abc
		// System.out.println(op4.orElse("빈객체")); // abc
		op4.ifPresent(x->System.out.println(x.charAt(0))); // a
			// ifPresent() 
			//   : Optional 객체가 null이면 false. 아무것도 λ°˜ν™˜ν•˜μ§€ μ•ŠμŒ
			//	 : null 이 μ•„λ‹ˆλ©΄ 인자λ₯Ό μ‹€ν–‰
		
		str = null;
		// System.out.println(str.charAt(0)); // λŸ°νƒ€μž„
		Optional<String> op5 = Optional.ofNullable(str);
		op5.ifPresent(a->System.out.println(a.charAt(0)));
				// 아무것도 좜λ ₯ λ˜μ§€ μ•ŠλŠ”λ‹€. println()이 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.
		
		User u = new User();
		System.out.println(u.get(null)); // default
		System.out.println(u.get("μžλ°”")); // μžλ°”

	}
}

class User {
	public String get(String s) {
		Optional<String> op = Optional.ofNullable(s);
		String str = op.orElseGet(this::defaultValue);
			// orElseGet(a)
		    //   : null 이 μ•„λ‹ˆλ©΄ κ·Έ 값을 λ°˜ν™˜ν•˜κ³ 
			//   : null 이면 인수둜 μ „λ‹¬λœ κ°’(a) λ°˜ν™˜      
		return str;
	}
	
	public String defaultValue() {
		return "default";
	}
	
}
package ch17.optionalEx;

import java.util.NoSuchElementException;
import java.util.Optional;

public class Ex02 {

	public static void main(String[] args) {
		// λ¬Έμžμ—΄μ„ μ •μˆ˜λ‘œ
		Integer n = Optional.of("123")
				.map(Integer::valueOf)
				.orElseThrow(NoSuchElementException::new);
		System.out.println(n);

		n = Optional.of("123")
				.map(Integer::valueOf)
				.get();
		System.out.println(n);
		
	}

}
package ch17.optionalEx;

import java.util.Optional;

public class Ex03 {
	public static void main(String[] args) {
		String s = getCity2(null);
		System.out.println(s);
	}
	
	public static String getCity(Order order) {
		if(order != null) {
			Member member = order.getMember();
			
			if(member != null) {
				Address address = member.getAddress();
				if(address != null) {
					String city = address.getCity();
					if(city != null) {
						return city;
					}
				}
			}
		}
		
		return "λ„μ‹œ μ—†μŒ";
	}
	
	public static String getCity2(Order order) {
		return Optional.ofNullable(order)
				.map(Order::getMember)
				.map(Member::getAddress)
				.map(Address::getCity)
				.orElse("λ„μ‹œ μ—†μŒ");
	}

}

class Address {
	private String city;
	private String street;
	
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
}

class Member {
	private String id;
	private String name;
	private Address address;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}
}

class Order {
	private long num;
	private String product;
	private Member member;
	
	public long getNum() {
		return num;
	}
	public void setNum(long num) {
		this.num = num;
	}
	public String getProduct() {
		return product;
	}
	public void setProduct(String product) {
		this.product = product;
	}
	public Member getMember() {
		return member;
	}
	public void setMember(Member member) {
		this.member = member;
	}
	
}

 

 

슀트림 νŠΉμ§•

μŠ€νŠΈλ¦Όμ€ 데이터 μ†ŒμŠ€λ‘œ λΆ€ν„° 데이터λ₯Ό 읽기만 ν•  뿐 λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€. μŠ€νŠΈλ¦Όμ€ ν•œλ²ˆλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. λ°˜λ³΅μžμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν•œλ²ˆ 탐색할 μš”μ†Œλ₯Ό λ‹€μ‹œ νƒμƒ‰ν•˜λ €λ©΄ λ°μ΄ν„°μ†ŒμŠ€μ—μ„œ μƒˆλ‘œμš΄ μŠ€νŠΈλ¦Όμ„ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. 

 

package ch17.streamEx;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;

public class Ex01 {

	public static void main(String[] args) {
		List<String> list = Arrays.asList("A", "B", "C");
		
		// μ»¬λ ‰μ…˜ μ‚¬μš© 예
		Iterator<String> it = list.iterator();
		while(it.hasNext()) {
			String s = it.next();
			System.out.println(s);
		}
		System.out.println();
		
		// 슀트림 μ‚¬μš© 예
		Stream<String> stream = list.stream();
		// stream.forEach(s -> System.out.println(s)); // λžŒλ‹€μ‹
		stream.forEach(System.out::println); // λ©”μ†Œλ“œ μ°Έμ‘°
		
		
		

	}

}

 

package ch17.streamEx;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Ex02 {

	public static void main(String[] args) {
		List<String> list = Arrays.asList("X", "A", "B", "A", "X", "C", "Y");
		
		// 쀑볡 제거
		
		// κΈ°μ‘΄ 방식
		for(int i=0; i<list.size(); i++) {
			if(list.indexOf(list.get(i)) == i) {
				System.out.println(list.get(i));
			}
		}
		System.out.println();
	
		// 슀트림
		Stream<String> stream = list.stream();
		stream.distinct()
			.forEach(System.out::println);
		System.out.println();
		
		// μ΅œμ’…μ—°μ‚°μ€ 슀트림의 μš”μ†Œλ₯Ό λͺ¨λ‘ μ†Œλͺ¨ν•˜λ―€λ‘œ ν•œλ²ˆλ§Œ 연산이 κ°€λŠ₯
		// stream.forEach(System.out::println); // λŸ°νƒ€μž„μ˜€λ₯˜
		
		Stream<String> stream2 = list.stream();
		stream2.distinct() // μ€‘λ³΅μ œκ±°(쀑간연산)
			.limit(3) //  쀑간연산
			.sorted() // 쀑산연산
			.forEach(System.out::println);
		
	}

}

 

package ch17.streamEx;

import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Ex03 {

	public static void main(String[] args) {
		// 슀트림 생성 방법
		
		// μ»¬λ ‰μ…˜μ—μ„œ 생성
		List<String> list = Arrays.asList("A", "B", "C");
		Stream<String> stream = list.stream();
		stream.forEach(System.out::print);
		System.out.println("\n");
		
		// λ°°μ—΄μ—μ„œ 생성
		String[] ss = new String[] {"A", "B", "C"};
		// Stream<String> stream2 = Stream.of(ss); // 슀트림의 클래슀 λ©”μ†Œλ“œ
		Stream<String> stream2 = Arrays.stream(ss); 
		stream2.forEach(System.out::print);
		System.out.println("\n");
		
		// νŠΉμ • λ²”μœ„μ—μ„œ 슀트림 생성
		IntStream stream3 = IntStream.range(1, 6); // end λ²”μœ„ 미포함
		stream3.forEach(System.out::print);
		System.out.println("\n");
		
		IntStream stream4 = IntStream.rangeClosed(1, 5); // end λ²”μœ„ 포함
		stream4.forEach(System.out::print);
		System.out.println("\n");
		
		
		// λ‚œμˆ˜μ—μ„œ 슀트림 생성
		IntStream stream5 = new Random().ints(); // λ¬΄ν•œ 슀트림
		stream5.limit(5).forEach(System.out::println);
		System.out.println("\n");
		
		IntStream stream6 = new Random().ints(5); // 5개의 λ‚œμˆ˜
		stream6.forEach(System.out::println);
		System.out.println("\n");

		IntStream stream7 = new Random().ints(5, 1, 11); // 1~10μ‚¬μ΄μ˜ 5개의 λ‚œμˆ˜
		stream7.forEach(System.out::println);
		System.out.println("\n");
	}

}

 

package ch17.streamEx;

import java.util.stream.Stream;

public class Ex04 {

	public static void main(String[] args) {
		// 슀트림 생성 방법
		// λžŒλ‹€μ‹
		Stream<Integer> s = Stream.iterate(0, n -> n + 2);
							// λ¬΄ν•œ 슀트림. 0λΆ€ν„° 짝수
							// iterate(seed, f) : seed λΆ€ν„° f에 μ˜ν•΄ κ³„μ‚°λœ κ²°κ³Όλ₯Ό λ‹€μ‹œ seed둜 ν•΄μ„œ 계산을 반볡
		s.limit(5).forEach(System.out::println);
		System.out.println();
		
		// generate(s) : λžŒλ‹€μ‹μ— μ˜ν•΄ κ³„μ‚°λœ μš”μ†Œλ‘œν•˜λŠ” λ¬΄ν•œ 슀트림 생성. 이전 κ²°κ³Όλ₯Ό 계산에 μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
		Stream<Double> s2 = Stream.generate(Math::random);
		s2.limit(5).forEach(System.out::println);
		System.out.println();
		
		
		
		

	}

}

 

package ch17.streamEx;

import java.util.stream.IntStream;

public class Ex05 {

	public static void main(String[] args) {
		// 슀트림 쀑간 μ—°μ‚°
		
		IntStream s1 = IntStream.range(0, 10);
		s1.skip(4).forEach(n->System.out.print(n+" "));
		// skip(n) : n개 μ œμ™Έ
		System.out.println("\n");
		
		IntStream s2 = IntStream.range(0, 10);
		s2.limit(4).forEach(n->System.out.print(n+" "));
		// limit(n) : μ²˜μŒλΆ€ν„° n개 만큼으둜 μ œν•œ
		System.out.println("\n");
		
		IntStream s3 = IntStream.range(0, 10);
		s3.skip(3).limit(4).forEach(n->System.out.print(n+" "));
		System.out.println("\n");
		
		// ν™€μˆ˜λ§Œ
		IntStream s4 = IntStream.range(0, 10);
		s4.filter(n->n%2!=0).forEach(n->System.out.print(n+" "));
		// filter(쑰건) : 쑰건에 λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ‘œ κ΅¬μ„±λœ ν•„ν„°
		System.out.println("\n");
		
		// peek() : 슀트림의 μš”μ†Œλ₯Ό μ†Œλͺ¨ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ—¬λŸ¬λ²ˆ μ‚¬μš© κ°€λŠ₯
		IntStream s5 = 
				IntStream.of(7,5,5,2,1,2,3,5,4,6);
		s5.peek(s -> System.out.println("원본:"+s))		
			.skip(2)
			.peek(s -> System.out.println("skip(2):"+s))
			.limit(5)
			.peek(s -> System.out.println("limit(5):"+s))
			.sorted()
			.forEach(System.out::println);
	}
}

'πŸ’» > JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

(38) [JAVA] 22일  (0) 2024.04.10
(36-37) [JAVA] 20-21일  (0) 2024.04.10
(35) [JAVA] 19일  (1) 2024.04.10
(34) [JAVA] 18일 μž…μΆœλ ₯ 슀트림(I/O Stream) - 2  (0) 2024.04.03
(33) [JAVA] 18일 μž…μΆœλ ₯ 슀트림(I/O Stream)  (0) 2024.04.03