이전에는 동기적 연산에서 예외를 제어하는 것을 봤었다. 이번에는 비동기적 연산에서 각 쓰레드에서 예외를 제어해보겠다. 동기적 연산에서는 그냥 코드들을 다 묶어서 예외처리를 해버렸다. 하지만 비동기연산에서는 호출자에게 예외를 넘기지 않아 호출자에서 예외를 처리할 수가 없다. 이럴 경우 스스로 예외를 처리해야한다. 나는 이 문제의 해결을 위해 BiFunction 타입을 선택했다. 이 타입은 Runnable과 Consumer 타입을 각각 인자로 받아 Runnable 타입을 리턴하는 함수를 지칭한다. public static void parallelTest(Runnable run1 , Runnable run2, Consumer con){ BiFunction bi = (run, consumer)->{ return..
자바8에서는 메소드에서 함수도 리턴할 수 있다.이전에 했던 파일필터를 약간 변형하여디렉토리이면서 이름이 4글자 이상인 파일명을 필터링하는 함수를 리턴하는 메소드를 만들어보겠다 public static Predicate checkDirectory(int minLength){return file->file.getName().length() > minLength && file.isDirectory();} public static void main(String[] arg){File[] fileList = new File("경로").listFiles();Predicate filter = file->file.isDirectory();int minLength = 4;List directories = Arrays.st..
특정 기준을 만족하는 파일들을 처리하는 메소드를 작성하려면 FileFilter 클래스보다는 Predicate 을 추천한다. public static void main(String[] arg){ File[] fileList = new File("경로").listFiles(); List directories = Arrays.stream(fileList) .filter(file->file.isDirectory()) .collect(Collections.toList()); } 이러면 directories 변수에는 fileList에서 디렉토리만 걸러진 결과가 들어가게 된다. stream의 filter 메소드는 Predicate 타입을 인자로 받으므로 아래와 같이도 가능하다. public static void ma..
지연실행은 코드를 바로 실행하지 않고 코드 실행을 필요로 할 때 실행하도록 하는 것이다.코드를 나중에 실행하는 이유는 다음과 같다. - 별도의 스레드에서 코드 실행- 코드를 여러번 실행- 적절한 시점에 실행- 어떤 일이 발생(이벤트)했을 때 실행 책의 예제를 보자면 logger.info("x : " + x + ", y : " + y ); 이 코드를 실행하면 먼저 문자열을 조립하고 info 메소드를 호출하면서 조립된 문자열을 인자로 전달한다.하지만 로그레벨이 info 메세지를 기록하지 않도록 로그레벨이 설정되어 있다면문자열을 조립하는 불필요한 연산을 수행하게 된 것이다. 이 예제를 필요할 때(로그에 기록될 때)에만 코드를 실행하게 하려면1. 람다를 받는다2. 호출해야 하는지 검사한다.3. 필요할 때 람다를..
현재까진 다른 메소드들이 리턴해온 Optional 객체를 사용해왔다.이제는 Optional 객체를 만드는 법을 알아보겠다. Optional의 정적 메소드 Optional.empty() 메소드를 사용하면 결과값이 없는Optional의 객체를 생성할 수 있다. 값이 있는 객체를 생성하려면 Optional의 정적 메소드 of(값) 메소드를 쓴다.Optional opt = Optional.of("Hello");위 코드는 Hello의 값을 갖고있는 Optional의 객체를 생성한다. 두가지를 섞은 메소드도 있다. Optional의 정적메소드 ofNullable(obj) 메소드는obj의 값이 null이면 Optional.empty()를 리턴하고, 값이 있으면 Optional.of(obj)를 리턴한다.
무상태변환이란 필터링이나 스트림에서 요소를 추출할 때 결과가 이전의 요소에 의존하지 않는 것이다. 즉 요소의 순서가 무작위이다. 하지만 상태유지변환도 존재한다. distinct 메소드는 중복만 제거할 뿐 요소의 순서는 이전의 요소와 같은 순서를 가진 새 스트림을리턴한다. 저번에 올린 글처럼 List의 forEach 메소드는 순서대로 출력되었고,Map의 forEach 메소드는 무작위 출력인 것을 보면 이름은 같지만List의 forEach는 는 상태유지변환, Map의 forEach는 무상태변환일것이다.
Stream의 limit 메소드는 저번에도 한번 썼지만 인자로 전달된 숫자만큼의 요소를 불러온 후끝나는 스트림을 리턴한다. List list = .... // ("A", "B", "C", "D", "E", "F", "G") 가 들어있다list.stream().limit(5).forEach(System.out::println); 이렇게 하면ABCDE가 출력된다. limit 메소드는 무한스트림을 사용할 때 유용하다. 그리고 skip 메소드가 있다.skip 메소드는 limit과는 반대로 인자로 전달된 숫자만큼 요소를 건너뛰고 불러온다. List list = .... // ("A", "B", "C", "D", "E", "F", "G") 가 들어있다list.stream().skip(5).forEach(System..
map() 메소드는 스트림에 있는 값을 변환하고 싶을 때 사용된다. 인자로는 하나의 인자를 받아 자신이 받은 인자와 같은 타입을 리턴하는 함수를 받는다(String인자->String리턴) 예를 들어보자면List list = ...... // 이미 값이 들어있다Stream stream = list.stream().map(str->str.trim()); 이렇게 하면 스트림 내 문자열들의 공백이 제거된다. 혹은 상수로 바꿀 수도 있다. Stream stream = list.stream().map(str->"Hello"); 인자로 전달되는 함수는 String을 인자로 받기 때문에 String을 리턴하면 된다.그러므로 변환없이 스트레이트로 "Hello"를 리턴하면 모든 값이 Hello가 된다.
- Total
- Today
- Yesterday
- javascript
- 컴퓨터 시간
- 자료구조
- Java8
- Jackson
- 퍼포먼스
- Stream
- 자바
- 시간
- rambda
- opensource
- react
- 람다
- RAMDA
- 날짜
- 성능
- Java
- 자바 성능
- gitlab
- Clojure
- 코어
- 리액트
- Swift 2.0
- json
- 메모리
- 알람
- Docker
- 성능개선
- 프로세서
- 클로저
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |