public class Item47 {
public static void main(String[] args) {
for (ProcessHandle ph : ProcessHandle.allProcesses()::iterator) { // 컴파일 에러가 난다.
// 프로세스를 처리한다.
}
}
}
public class Item47 {
public static void main(String[] args) {
for (ProcessHandle ph : (Iterable<ProcessHandle>) ProcessHandle.allProcesses()::iterator) {
// 프로세스를 처리한다.
}
}
}
public class Item47 {
public static void main(String[] args) {
for (ProcessHandle p : iterableOf(ProcessHandle.allProcesses())) {
// 프로세스를 처리한다.
}
}
public static <E> Iterable<E> iterableOf(Stream<E> stream) {
return stream::iterator;
}
}
Iterable<E>
를 Stream<E>
로 중개해주는 어댑터public class Item47 {
public static <E> Stream<E> streamOf(Iterable<E> iterable) {
return StreamSupport.stream(iterable.spliterator(), false);
}
}
참고 : Collection의 size 메서드는 int 값을 반환하는데, 따라서 이 경우 시퀀스의 최대 길이는 Integer.MAX_VALUE
혹은 2^31 - 1
로 제한된다.
public class SubLists {
public static <E> Stream<List<E>> of(List<E> list) {
return Stream.concat(Stream.of(Collections.emptyList()), prefixes(list).flatMap(SubLists::suffixes));
}
private static <E> Stream<List<E>> prefixes(List<E> list) {
return IntStream.rangeClosed(1, list.size())
.mapToObj(end -> list.subList(0, end));
}
private static <E> Stream<List<E>> suffixes(List<E> list) {
return IntStream.range(0, list.size())
.mapToObj(start -> list.subList(start, list.size()));
}
}
import java.util.ArrayList;
public class Temp {
public static void main(String[] args) {
List<String> src = new ArrayList<>(); // 편의상 String 타입으로 작성하였음.
for (int start = 0; start < src.size(); start++) {
for (int end = start + 1; end <= src.size(); end++) {
System.out.println(src.subList(start, end));
}
}
}
}
public class SubLists {
public static <E> Stream<List<E>> of(List<E> list) {
return IntStream.range(0, list.size())
.mapToObj(start -> IntStream.rangeClosed(start + 1, list.size())
.mapToObj(end -> list.subList(start, end)))
.flatMap(x -> x);
}
}