2016-06-17 10 views
4

나는 스트림에 꽤 익숙하다.자바, 원소를 찾지 못하면 찾는다.

은 내가 geometriesEC_Geometry ArrayList를 스트리밍하고 싶습니다과 EC_Geometry 요소가 존재 (또는 equals 결코 true을 반환 이상)되어 있지 않은 경우, 나는 그것을 추가 할 수 있습니다.

public void init(GL3 gl3, EC_Mesh mesh) { 

    geometries.stream() 
      .filter(geometry -> mesh.getGeometry().equals(geometry)) 
      .findAny() 
      .orElse(..?); 
} 

그러나 나는 그것이 스트림을 사용하여 마지막 줄

는 어떻게 해결할 수에 막혔어요? 형상이 동일한 경우

equals 내가 확인 쓴 방법이다 있습니다 (예 : 삼각형은 해당 경우)

+0

무엇을 함께 추가 하시겠습니까? 'geometries :: add' – Olayinka

+0

'mesh.getGeometry()'를'geometries'에 추가하려는 나쁜 시도였습니다. – elect

+1

필터는'mesh.getGeometry() :: equals'로 쓰여질 수 있습니다. –

답변

4

orElse는 것이 바람직하므로 항상 반환 된 값을 사용하지 않는 경우에도 실행됩니다 아무 것도 발견되지 않을 경우에만 실행될 orElseGet을 사용하십시오.

geometries.stream() 
      .filter(geometry -> mesh.getGeometry().equals(geometry)) 
      .findAny() 
      .orElseGet(() -> { 
       geometries.add(mesh.getGeometry()); 
       return mesh.getGeometry(); 
      }); 
+0

감사합니다. 작동하는 것 같습니다. Ps : 세미콜론이'add' 메소드 끝에 없어서 단 하나의 문자를 수정할 수 없다. – elect

+3

'.filter (mesh.getGeometry() :: equals)'는 각 스트림 요소에 대해 getGeometry()를 호출하지 않도록한다. ... – Holger

+0

당신은 더 자세히 설명 할 수 있습니까, 홀거? – elect

2
.findAny().orElse(..?); 

는 옵션입니다 - 당신이 찾은 첫 번째 요소를 얻을하려는 경우.

meshG = mesh.getGeometry(); 
if (!geometries.contains(meshG)) { 
    geometries.add(meshG); 
} 

남용 스트림 API에 대한 필요가 없습니다 : 당신이 가장 좋은 방법을 달성하고자하는 것을 들어

은하는 것입니다.

+0

나는 자바를 찾고 있지 않다는 것을 명확하게하기 위해 질문을 수정했다.'Obejct' 비교 – elect

+0

오. 그래도 난 최선을 다 했어. 스트림으로 재미있게 보내십시오. @ –

+3

@elect : 가장 간단하고 직접적인 해결책이며 스트림을 대신 사용하는 것이 개선되지 않는다는 사실은 변하지 않습니다. – Holger

관련 문제