λΉμ¦λμ€ μꡬμ¬ν μ 리
λ°μ΄ν°: νμID, μ΄λ¦
κΈ°λ₯: νμ λ±λ‘, μ‘°ν
μμ§ λ°μ΄ν° μ μ₯μκ° μ μ λμ§ μμ(κ°μμ μλ리μ€)
νμ λλ©μΈκ³Ό 리ν¬μ§ν 리 λ§λ€κΈ°
νμ κ°μ²΄
domain ν¨ν€μ§μ Member ν΄λμ€ μμ±
hello.hellospring.domain
package hello.hellospring.domain;
public class Member {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
νμ 리ν¬μ§ν 리 μΈν°νμ΄μ€
repository
νμκ°μ²΄λ₯Ό μ μ₯νκΈ° μν μ μ₯μ
MemberRepository μΈν°νμ΄μ€ μμ±
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
μλ°μ Interface λ¬Έλ²
void feed(Tiger tiger) { // νΈλμ΄κ° μ€λ©΄ μ¬κ³Όλ₯Ό λμ Έ μ€λ€. System.out.println("feed apple"); }
void feed(Lion lion) { // μ¬μκ° μ€λ©΄ λ°λλλ₯Ό λμ Έμ€λ€. System.out.println("feed banana");
μ λ ₯κ°μ μλ£ν νμ μ΄ λ€λ₯Ό κ²½μ°(μμμλ Tiger, LionμΌλ‘ μλ‘ λ€λ₯΄λ€) λ©μλ λͺ μ λμΌνκ²(μ¬κΈ°μλ λ©μλλͺ μ΄ feedλ‘ λμΌνλ€) μ¬μ©ν μ μλ€.
μ΄λ°κ²μ λ©μλ μ€λ²λ‘λ©(Method overloading)μ΄λΌκ³ νλ€.
λλ¬Όμμ νΈλμ΄μ μ¬μλΏμ΄λΌλ©΄ ZooKeeper ν΄λμ€λ λ μ΄μ ν μΌμ΄ μκ² μ§λ§
μ μ΄, νλ² λ±μ΄ κ³μ μΆκ°λλ€λ©΄ ZooKeeperλ μ‘μλλ¬Όμ΄ μΆκ°λ λλ§λ€ λ§€λ² λ€μκ³Ό κ°μ feed λ©μλλ₯Ό μΆκ°ν΄μΌ νλ€.
μ΄λ° μ΄λ €μμ 극볡νκΈ° μν΄μλ μΈν°νμ΄μ€μ λμμ΄ νμνλ€.
μΈν°νμ΄μ€λ interface ν€μλλ₯Ό ν΅ν΄ μ μΈν μ μμΌλ©° implements ν€μλλ₯Ό ν΅ν΄ μΌλ° ν΄λμ€μμ μΈν°νμ΄μ€λ₯Ό ꡬν
interface Predator {
String getFood();
}
μΈν°νμ΄μ€μ λ©μλλ λ©μλμ μ΄λ¦κ³Ό μ μΆλ ₯μ λν μ μλ§ μκ³ κ·Έ λ΄μ©μ μλ€.
κ·Έ μ΄μ λ μΈν°νμ΄μ€λ κ·μΉμ΄κΈ° λλ¬Έμ΄λ€.
μμμ μ€μ ν getFoodλΌλ λ©μλλ μΈν°νμ΄μ€λ₯Ό implementsν ν΄λμ€λ€μ΄ ꡬνν΄μΌλ§ νλ κ²μ΄λ€.
class Tiger extends Animal implements Predator {
public String getFood() {
return "apple";
}
}
μΈν°νμ΄μ€μ λ©μλλ νμ publicμΌλ‘ ꡬνν΄μΌ νλ€.
νμ 리ν¬μ§ν 리 λ©λͺ¨λ¦¬ ꡬν체
MemoryMemberRepsoitory ν΄λμ€ μμ±
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(),member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
}
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(),member);
return member;
storeμ λ£κΈ°μ μ memberμ sequence κ°μ μ¬λ € id κ°μ μΈν
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
ofNullalbe() : null μ΄μ¬λ κ°μ μ μλλ‘
Optionalμ΄λ?
NPE(NullPointerException) μ΄λ? ]
κ°λ°μ ν λ κ°μ₯ λ§μ΄ λ°μνλ μμΈ μ€ νλκ° λ°λ‘ NPE(NullPointerException)μ΄λ€.
NPEλ₯Ό νΌνλ €λ©΄ null μ¬λΆλ₯Ό κ²μ¬ν΄μΌ νλλ°, null κ²μ¬λ₯Ό ν΄μΌ νλ λ³μκ° λ§μ κ²½μ° μ½λκ° λ³΅μ‘ν΄μ§κ³ λ²κ±°λ‘λ€.
κ·Έλμ null λμ μ΄κΈ°κ°μ μ¬μ©νκΈΈ κΆμ₯νκΈ°λ νλ€.
[ Optionalμ΄λ? ]
Java8μμλ Optional <T> ν΄λμ€λ₯Ό μ¬μ©ν΄ NPEλ₯Ό λ°©μ§ν μ μλλ‘ λμμ€λ€.
Optional<Optional <T>λnullμ΄ μ¬ μ μλ κ°μ κ°μΈλ Wrapper ν΄λμ€λ‘, μ°Έμ‘°νλλΌλ NPEκ° λ°μνμ§ μλλ‘ λμμ€λ€. Optional ν΄λμ€λ μλμ κ°μ valueμ κ°μ μ μ₯νκΈ° λλ¬Έμ κ°μ΄ nullμ΄λλΌλ λ°λ‘ NPEκ° λ°μνμ§ μμΌλ©°,
ν΄λμ€μ΄κΈ° λλ¬Έμ κ°μ’ λ©μλλ₯Ό μ κ³΅ν΄ μ€λ€.
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
λλ€(Lambda)
μλ°λ Java 8 λ²μ λΆν° ν¨μν νλ‘κ·Έλλ°μ μ§μνκΈ° μν΄ λλ€(Lambda)μ μ€νΈλ¦Ό(Stream)μ΄ λμ λμλ€.
λλ€μ μ€νΈλ¦Όμ μ¬μ©νλ©΄ μμ μ ννλ ν¨μν νλ‘κ·Έλλ° μ€νμΌλ‘ μλ° μ½λλ₯Ό μμ±ν μ μλ€.
λλ€μ μ€νΈλ¦Όμ μ¬μ©νλ μ΄μ λ μμ±νλ μ½λμ μμ΄ μ€μ΄λ€κ³ μ½κΈ° μ¬μ΄ μ½λλ₯Ό λ§λλλ° μ 리νκΈ° λλ¬Έμ΄λ€.
λλ€μμ κ°λ¨ν μ μνλ©΄ λ€μκ³Ό κ°μ΅λλ€.
μλ³μ μμ΄ μ€ν κ°λ₯ν ν¨μ ννμ
Calculator μΈν°νμ΄μ€λ₯Ό ꡬνν MyCalculator ν΄λμ€λ₯Ό μμ±νμλ€.
κ·Έλ¬λ©΄ μ΄μ MyCalculator ν΄λμ€λ λ€μμ²λΌ μ¬μ©ν μ μλ€.
interface Calculator {
int sum(int a, int b);
}
class MyCalculator implements Calculator {
public int sum(int a, int b) {
return a+b;
}
}
public class Sample {
public static void main(String[] args) {
MyCalculator mc = new MyCalculator();
int result = mc.sum(3, 4);
System.out.println(result); // 7 μΆλ ₯
}
}
λλ€λ₯Ό μ μ©ν μ½λ
μ΄μ μμμ μμ±ν μ½λλ₯Ό λ€μμ²λΌ λλ€λ₯Ό μ μ©ν μ½λλ‘ λ°κΎΈμ΄ 보μ.
interface Calculator {
int sum(int a, int b);
}
public class Sample {
public static void main(String[] args) {
Calculator mc = (int a, int b) -> a +b;
int result = mc.sum(3, 4);
System.out.println(result);
}
}
μ μ½λμμ μ¬μ©ν λλ€ ν¨μλ λ€μκ³Ό κ°λ€.
(int a, int b) -> a +b
Stream
μ€νΈλ¦Όμ μ¬μ μ μλ―Έλ 'νλ₯΄λ€' λλ 'κ°μΈ'μ λλ€. νλ‘κ·Έλλ°μμμ μ€νΈλ¦Όλ μ¬μ μ μλ―Έμ ν¬κ² λ€λ₯΄μ§ μμ΅λλ€.
λ€λ§, μ¬κΈ°μλ λ¬Όμ΄ νλ₯΄λ κ²μ μλκ³ 'λ°μ΄ν°μ νλ¦'μ λ§ν©λλ€.
λκ° μΆμμ μΌλ‘λ λμΆ© λ°μ΄ν°κ° νλ₯΄κ² ꡬλ.
컬λ μ , λ°°μ΄ λ±μ μ μ₯λ μμλ€μ νλμ© μ°Έμ‘°νλ©΄μ μ½λλ₯Ό μ€νν μ μλ κΈ°λ₯μ λλ€.
Streamμ μ¬μ©νλ©΄, λΆνμν forλ¬Έμ μ¬μ©νμ§ μμ μ μκ³ , λλ€μμ νμ©ν μ μμ΄μ μ½λλ₯Ό μ§κ΄μ μ΄κ² μ²λ¦¬ν μ μμ΅λλ€.
μ€νΈλ¦Ό μμ±νκΈ°
μ€νΈλ¦Όμ μ€κ° μ°μ° λͺ©λ‘
- Stream<T> distinct() #μ€λ³΅μ μ κ±°
- Stream<T> filter(Predicate<T> predicate) #쑰건μ μ λ§λ μμ μ μΈ
- Stream<T> limit(long maxSize) #μ€νΈλ¦Όμ μΌλΆλ₯Ό μλΌλ
- Stream<T> skip(long n) #μ€νΈλ¦Όμ μΌλΆλ₯Ό 건λλ
- Stream<T> peek(Consumer<T> action) #μ€νΈλ¦Όμ μμμ μμ
μν
- Stream<T> sorted() #μ€νΈλ¦Όμ μμλ₯Ό μ λ ¬
Stream<T> sorted(Comparator<T> comparator)
- Stream<R> map(Function<T,R> mapper) #μ€νΈλ¦Όμ μμλ₯Ό λ³ν
DoubleStream mapToDouble(ToDoubleFunction<T> mapper)
IntStream mapToInt(ToIntFunction<T> mapper)
LongStream mapToLong(ToLongFunction<T> mapper)
Stream<R> flatmap(Function<T,Stream<R>> mapper)
DoubleStream flatMapToDouble(Function<T,DoubleStream> m)
IntStream flatMapToInt(Function<T,IntStream> m)
LongStream flatMapToLong(Function<T,LongStream> m)
μ€νΈλ¦Όμ μ΅μ’ μ°μ° λͺ©λ‘
- void forEach(Consumer<? super T> action) #κ° μμμ μ§μ λ μμ
μν
void forEachOrdered(Consumer<? super T> action)
- long count() #μ€νΈλ¦Όμ μμμ κ°μ λ°ν
- Optional<T> max(Comparator<? super T> comparator) #μ€νΈλ¦Όμ μ΅λκ°/μ΅μκ°μ λ°ν
Optional<T> min(Comparator<? super T> comparator)
- Optional<T> findAny() # μ무거λ νλ #μ€νΈλ¦Όμ μμ νλλ₯Ό λ°ν
Optional<T> findFirst() # 첫 λ²μ§Έ μμ
- boolean allMatch(Predicate<T> p) # λͺ¨λ λ§μ‘±νλμ§ #μ£Όμ΄μ§ 쑰건μ λͺ¨λ μμκ° λ§μ‘±μν€λμ§, λ§μ‘±μν€μ§ μλμ§ νμΈ
boolean anyMatch(Predicate<T> p) # νλλΌλ λ§μ‘±νλμ§
boolean noneMatch(Predicate<> p) # λͺ¨λ λ§μ‘±νμ§ μλμ§
- Object[] toArray()
A[] toArray(IntFunction<A[]> generator) # μ€νΈλ¦Όμ λͺ¨λ μμλ₯Ό λ°°μ΄λ‘ λ°ν
- Optinal<T> reduce(BinaryOperator<T> accumulator) #μ€νΈλ¦Όμ μμλ₯Ό νλμ© μ€μ¬κ°λ©΄μ(리λμ±) κ³μ°
T reduce(T identity, BinaryOperator<T> accumulator)
U reduce(U identity, BiFunction<U,T,U> accumulator,BinaryOperator<U> combiner)
- R collect(Collector<T,A,R> collector) #μ€νΈλ¦Όμ μμλ₯Ό μμ§νλ€. μ£Όλ‘ μμλ₯Ό κ·Έλ£Ήν νκ±°λ λΆν ν κ²°κ³Όλ₯Ό 컬λ μ
μ λ΄μ λ°ννλλ° μ¬μ©νλ€.
Stream.filter()
filter()λ μΈμλ‘ ν¨μλ₯Ό λ°μΌλ©°, μ΄λ€ 쑰건μΌλ‘ Streamμ μμλ€μ νν°λ§ν©λλ€.
μ¬κΈ°μ μΈμλ‘ μ λ¬λλ ν¨μλ₯Ό ꡬννμ¬ νν°λ§νλ 쑰건μ μ€μ ν μ μμ΅λλ€.
μλ μμ λ filter()λ₯Ό μ¬μ©νμ¬ Streamμ μμλ€ μ€μ "c"λ‘ μμνλ λ¬Έμμ΄λ€μ λͺ¨λ νν°λ§ν©λλ€.
List<String> list =
Arrays.asList("a1", "a2", "b1", "b2", "c2", "c1", "c3");
Stream<String> stream = list.stream();
Stream<String> filtered = stream.filter(s -> s.startsWith("c"));
filtered.forEach(System.out::println);
Output:
c2
c1
c3
λ°°μ΄ μ€νΈλ¦Ό
μ€νΈλ¦Όμ μ΄μ©νκΈ° μν΄μλ λ¨Όμ μμ±μ ν΄μΌ ν©λλ€.
μ€νΈλ¦Όμ λ°°μ΄ λλ 컬λ μ μΈμ€ν΄μ€λ₯Ό μ΄μ©ν΄μ μμ±ν μ μμ΅λλ€.
λ°°μ΄μ λ€μκ³Ό κ°μ΄ Arrays.stream λ©μλλ₯Ό μ¬μ©ν©λλ€.
1. String[] arr = new String[]{"a", "b", "c"};
2. Stream<String> stream = Arrays.stream(arr);
3. Stream<String> streamOfArrayPart =
4. Arrays.stream(arr, 1, 3); // 1~2 μμ [b, c]
Java - Stream findAny()
Streamμμ μ΄λ€ 쑰건μ μΌμΉνλ μμ(element) 1κ°λ₯Ό μ°Ύμ λ, findAny()μ findFirst() APIλ₯Ό μ¬μ©ν μ μμ΅λλ€.
findAny()λ Streamμμ κ°μ₯ λ¨Όμ νμλλ μμλ₯Ό 리ν΄νκ³ ,
findFirst()λ 쑰건μ μΌμΉνλ μμλ€ μ€μ Streamμμ μμκ° κ°μ₯ μμ μλ μμλ₯Ό 리ν΄ν©λλ€.
https://codechacha.com/ko/java8-stream-difference-findany-findfirst/
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
03-08 맡 (Map)
맡(Map)μ κ°μ₯ ν° νΉμ§μ΄λΌλ©΄ keyλ‘ valueλ₯Ό μ»μ΄λΈλ€λ μ μ΄λ€.
맡(Map)μ μ¬μ (dictionary)κ³Ό λΉμ·νλ€
key value
people | μ¬λ |
baseball | μΌκ΅¬ |
HashMap <String, String> map = new HashMap <>();
map.put("people", "μ¬λ");
map.put("baseball", "μΌκ΅¬");
keyμ valueλ μ μμ μμ 보λ―μ΄ put λ©μλλ₯Ό μ΄μ©νμ¬ μΆκ°ν μ μλ€.
System.out.println(map.get("people")); // "μ¬λ" μΆλ ₯
keyμ ν΄λΉνλ valueκ°μ μ»κΈ° μν΄μλ get λ©μλλ₯Ό μ¬μ©νλ€.
map κ°μ²΄μ ν€(Key) "people"μ λμνλ κ°(Value) "μ¬λ"μ΄ μΆλ ₯λλ€.
'Spring > Spring μ λ¬Έ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ€νλ§ μ λ¬Έ - (10) νμ μλΉμ€ κ°λ° (0) | 2023.01.20 |
---|---|
μ€νλ§ μ λ¬Έ - (9) νμ 리ν¬μ§ν 리 ν μ€νΈ μΌμ΄μ€ μμ± (1) | 2023.01.20 |
μ€νλ§ μ λ¬Έ - (7) API (0) | 2023.01.12 |
μ€νλ§ μ λ¬Έ - (6) MVCμ ν νλ¦Ώ μμ§ (0) | 2023.01.12 |
μ€νλ§ μ λ¬Έ - (5) μ μ 컨ν μΈ (0) | 2023.01.12 |