Chapter 2. 컬렉션의 사용
다음은 Java Collection Framework의 기본 상속 구조이다.
Java 프로그래밍을 하다보면 크게 3가지 객체타입을 마주하게 된다.
- List
Element 들의 순서가 있으며, 중복을 허용한다.
- Set
Element 들의 순서는 없고, 중복이 허용되지 않는다.
- Map
List와 Set이 집합적 개념이라면, Map은 검색적 개념이 가미된 Interface이다.
key와 value로 구성되며, key를 통해 value에 접근할 수 있다.
주로 사용되는 HashMap의 경우 Java 버전에 따라 동장 원리가 조금씩 차이가 있다.
(상세하게 알고 싶다면 아래 참고 사이트를 확인해라)
private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott");
|
public class Iteration { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { for (String name : friends) { System.out.println(name); } }
}
|
public class Iteration { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { friends.forEach(new Consumer<String>() { public void accept(final String name) { System.out.println(name); } }); }
}
|
public class Iteration { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { friends.forEach(name -> System.out.println(name)); friends.forEach(System.out::println); }
}
|
위 코드들은 모두 동일한 결과가 나온다.
조금 흥미로은 점은 마지막 코드 예제인데.
System.out::println 으로 method reference라고 한다. 추후 Steam API를 공부하게 되면 자연스럽게 접할 기회가 많으니, 여기서는 이런 방법도 있다 정도로 하고 넘어가면 좋을 것 같다.
public class Transform { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { final List<String> upperCaseNames = new ArrayList<String>(); for (String name : friends) { upperCaseNames.add(name.toUpperCase()); } System.out.println(upperCaseNames); }
}
|
- foreach() 적용 및 Lambda 적용
- Stream API 적용
- Method Reference 적용
public class Transform { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { final List<String> upperCaseNames = new ArrayList<String>(); friends.forEach(name -> upperCaseNames.add(name.toUpperCase())); System.out.println(upperCaseNames); }
}
|
public class Transform { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { friends.stream() .map(name -> name.toUpperCase()) .forEach(name -> System.out.print(name + " ")); }
}
|
public class Transform { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { friends.stream() .map(String::toUpperCase) .forEach(System.out::println); }
}
|
Method Reference 는 언제 사용하는 것일까?
람다 표현식을 사용할 때 파라미터를 전달하지 않는 경우라면 사용할 수 있다.
public class PickElements { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { final List<String> startsWithN = new ArrayList<String>(); for (String name : friends) { if (name.startsWith("N")) { startsWithN.add(name); } } System.out.println(startsWithN); }
}
|
public class PickElements { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { final List<String> startsWithN = friends.stream() .filter(name -> name.startsWith("N")) .collect(Collectors.toList()); System.out.println(startsWithN); }
}
|
public class PickElements { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); private final static List<String> editors = Arrays.asList("Brian", "Jackie", "John", "Mike"); public static void main(String[] args) { final List<String> friendsStartsWithN = friends.stream() .filter(name -> name.startsWith("N")) .collect(Collectors.toList()); System.out.println(friendsStartsWithN); final List<String> editorsStartsWithN = editors.stream() .filter(name -> name.startsWith("N")) .collect(Collectors.toList()); System.out.println(editorsStartsWithN); }
}
|
public class PickElements { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); private final static List<String> editors = Arrays.asList("Brian", "Jackie", "John", "Mike"); private final static Predicate<String> startsWithN = name -> name.startsWith("N"); public static void main(String[] args) { final List<String> friendsStartsWithN = friends.stream() .filter(startsWithN) .collect(Collectors.toList()); System.out.println(friendsStartsWithN); final List<String> editorsStartsWithN = editors.stream() .filter(startsWithN) .collect(Collectors.toList()); System.out.println(editorsStartsWithN); }
}
|
public class PickElements { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); private final static Predicate<String> startsWithN = name -> name.startsWith("N"); private final static Predicate<String> startsWithB = name -> name.startsWith("B"); public static void main(String[] args) { final List<String> friendsStartsWithN = friends.stream() .filter(startsWithN) .collect(Collectors.toList()); System.out.println(friendsStartsWithN); final List<String> friendsStartsWithB = friends.stream() .filter(startsWithB) .collect(Collectors.toList()); System.out.println(friendsStartsWithB); }
}
|
public class PickElements { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { final List<String> friendsStartsWithN = friends.stream() .filter(checkIfStartWith("N")) .collect(Collectors.toList()); System.out.println(friendsStartsWithN); final List<String> friendsStartsWithB = friends.stream() .filter(checkIfStartWith("B")) .collect(Collectors.toList()); System.out.println(friendsStartsWithB); } public static Predicate<String> checkIfStartWith(final String letter) { return name -> name.startsWith(letter); }
}
|
public static Predicate<String> checkIfStartWith(final String letter) {
return name -> name.startsWith(letter);
}
|
public class PickElements { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); private final static Function<String, Predicate<String>> startsWithLetter = letter -> { return name -> name.startsWith(letter); }; public static void main(String[] args) { final List<String> friendsStartsWithN = friends.stream() .filter(startsWithLetter.apply("N")) .collect(Collectors.toList()); System.out.println(friendsStartsWithN); final List<String> friendsStartsWithB = friends.stream() .filter(startsWithLetter.apply("B")) .collect(Collectors.toList()); System.out.println(friendsStartsWithB); }
}
|
private final static Function<String, Predicate<String>> startsWithLetter =
letter -> { return name -> name.startsWith(letter); };
|
private final static Function<String, Predicate<String>> startsWithLetter =
letter -> name -> name.startsWith(letter);
|
public class PickAnElement { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { pickName(friends, "B"); pickName(friends, "A"); } public static void pickName(final List<String> names, final String startingLetter) { String foundName = null; for (String name : names) { if (name.startsWith(startingLetter)) { foundName = name; break; } } System.out.println(String.format("A name starting with %s", startingLetter)); if (foundName != null) { System.out.println(foundName); } else { System.out.println("No name found"); } }
}
|
public class PickAnElement { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { pickName(friends, "B"); pickName(friends, "A"); } public static void pickName(final List<String> names, final String startingLetter) { final Optional<String> foundName = names.stream() .filter(name -> name.startsWith(startingLetter)) .findFirst(); System.out.println(String.format("A name starting with %s : %s", startingLetter, foundName.orElse("No name found"))); }
}
|
- isPresent() - 객체가 존재하는지?
- get() - 현재 값을 가져온다.
- orElse() - 값이 없는 경우 별도 처리를 할 수 있다.(위 코드 참조)
public class PickALongest { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { System.out.println("Total number of characters in all names : " + friends.stream() .mapToInt(name -> name.length()) .sum()); }
}
|
public class PickALongest { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { final Optional<String> aLongName = friends.stream() .reduce((name1, name2) -> name1.length() >= name2.length() ? name1 : name2); aLongName.ifPresent(name -> System.out.println(String.format("A longest name : %s", name)) ); }
}
|
R apply(T t, U u);
|
public class PickALongest { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { final String steveOverLonger = friends.stream() .reduce("Steve", (name1, name2) -> name1.length() >= name2.length() ? name1 : name2); System.out.println(String.format("A name over Steve's length : %s", steveOverLonger)); }
}
|
public class PrintList { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { for (String name : friends) { System.out.print(name + ", "); } System.out.println(); }
}
|
public class PrintList { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { for (int i=0; i < friends.size() - 1; i++) { System.out.print(friends.get(i) + ", "); } if (friends.size() > 0) { System.out.println(friends.get(friends.size() - 1)); } }
}
|
public class PrintList { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { System.out.println(String.join(",", friends)); }
}
|
public class PrintList { private final static List<String> friends = Arrays.asList("Brian", "Nate", "Neal", "Raju", "Sara", "Scott"); public static void main(String[] args) { System.out.println( friends.stream() .map(String::toUpperCase) .collect(Collectors.joining(", ")) ); }
}
|
참고 사이트
http://withwani.tistory.com/150
http://helloworld.naver.com/helloworld/textyle/831311 (Java8 HashMap 동작원리)
'Programing > Java' 카테고리의 다른 글
[자바8 람다의 힘] 3장 String, Comparator 그리고 filter (0) | 2015.04.01 |
---|---|
Java의 System.out을 파일 출력으로 변경하는 방법 (0) | 2015.03.30 |
Java에서 정규표현식은 이렇게 사용하자 (0) | 2015.03.12 |
json <-> java 변환 라이브러리 (GSON, Jackson) (0) | 2015.03.12 |
Lock VS ReentrantLock (0) | 2015.03.06 |