재미없다~
1k
2017-05-04 09:30:18
5
454

java8 stream 질문 있습니다.


for (int i = 0; i < 10; i++) {

if (i % 2 == 0)

list.add(i + 10);

}


위의 소스를 스트림을 이용해서 리스트로 담으려고 합니다.

그래서 일단 아래처럼 작성을 했는데


list = IntStream.range(0, 10).filter(i -> i%2 == 0).map(i -> i +10).boxed().collect(Collectors.toList());


이게 해당 메서드를 빠져나가면 list에 값이 사라지는데 스트림이 일회성이라서 그런 건가요?

그래서 아래처럼 바꿔봤는데


IntStream.range(0, 10).filter(i -> i%2 == 0).map(i -> i +10).forEach(i -> list.add(i));


이렇게 작성하면 stream을 이용해서 만들었다고 할수 있는지 좀 의문이 드네요.

for문을 이용한것보다 더 좋은점을 딱히 못느끼겠고 다른 방법이 있을까요?

0
0
  • 답변 5

  • 재미없다~
    1k
    2017-05-04 10:24:41 작성 2017-05-04 10:28:19 수정됨

    처럼 스트림으로 만들어진 리스트를 아래처럼 리턴시켜주니까 원하는대로 흘러가네요.


    private static List<Integer> createStreamList() {
    	// TODO Auto-generated method stub
    	return IntStream.range(0, 10).filter(i -> i%2 == 0).map(i -> i +10).boxed().collect(Collectors.toList());
    }


    call by reference로 메서드내에서 list에 주소를 할당해줘도

    메서드가 종료되면서 스트림이 사라지는거로 이해하긴 했는데 맞는지 모르겠네요.


    call by reference


    - 주소에 값을 저장하는 방식
    - Java 클래스 객체를 인수로 전달한 경우만 Call by Reference
    - 메소드 내의 처리 결과가 메서드 밖의 변수에 영향을 미친다.
    0
  • LichKing
    14k
    2017-05-04 10:26:04
    잘되는데 값이 사라진다는게 무슨말씀이신가요
    0
  • 재미없다~
    1k
    2017-05-04 10:31:47


    public static void main(String[] args) {
    	List<Integer> streamList = new ArrayList<>();
    	createStreamList(streamList);	
            System.out.println(streamList);
    }
    
    private static void createStreamList(List<Integer> streamList) {
    	// TODO Auto-generated method stub
    	streamList = IntStream.range(0, 10).filter(i -> i%2 == 0).map(i -> i +10).boxed().collect(Collectors.toList());
    System.out.println(streamList); }


    위에 처럼 했을때 createStreamList메소드 안에서는 리스트에 값이 있는데

    메소드 종료하고 메인으로 돌아오면 값이 없더라구요.

    0
  • LichKing
    14k
    2017-05-04 10:39:27

    createStramList() 메서드에 전달된 리스트의 내용을 변경하는게 아니라 참조 자체를 변경하는것이기때문입니다.


    public static void main(String[] args) {
    	List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
            System.out.println(list);
    }
    
    private static void createStreamList(List<Integer> list) {
    	list = new ArrayList<>();
    }


    이것과 같은건데요. 이건 이해가 되시나요?

    0
  • 재미없다~
    1k
    2017-05-04 10:59:43

    LichKing

    제가 뭔가 잘못알고 있는거 같네요 ㅠㅠ ㅋㅋㅋㅋㅋㅋ

    메서드에 파라메터로전달한 객체를 그대로 사용하는게 아니라

    전달한 객체의 주소값을 가지고 해당 메모리의 값을 변경해서 call by reference가 되는 것이군요

    메서드 내에서 참조하던 주소값을 변경해서 처리를 했으니 당연히 원하는 결과가 안나오고

    처리된 주소값을 리턴시켜서 메인에서 다시 재참조를 시켜야 하는거였나보네요 

    감이 잡힌거 같습니다. 


    이해하고 넘어간거 같아도 기초가 할때마다 어렵네요 ㅠㅠ

    좋은 답변 감사합니다~ ㅋㅋ

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.