2017-02-13 1 views
0

계층 주문 목록에 저장 경로와 그 검증 알고리즘은 매우 간단기능적인 스타일 검증 알고리즘

List<String> path = Lists.newArrayList("path","to","end"); 

Iterator<String> iterator = path.iterator(); 

while (iterator.hasNext()) { 
    if (iterator.next() == null) { 
     while (iterator.hasNext()) { 
      if (iterator.next() != null) { 
       throw new Exception("Invalid path"); 
      } 
     } 
    } 
} 

을 상상해보십시오.

모든 하위 노드가있는 리프 또는 노드 만 null이어야합니다.

유효한 경로 :

"path", "to", "end" 
"path", "to", null 
"path", null, null 
null, null, null 

잘못된 경로 : 나는 기능적인 스타일을 재 작성하는 방법을 찾고 있어요

"path", null, "end" 
null, null, "end" 
null, "to", "end" 
null, "to", null 

.

+1

나는 당신의 질문을 혼란스럽게 만드는 "유효한 경로"에 오타가 있다고 생각합니다. 'null' 주위에 따옴표를 넣으 려했다는 뜻입니까? – 4castle

+0

@ 4castle thx, 오타가 수정되었습니다 – Rob

+0

비 기능 솔루션의 문제점은 무엇입니까? 당신은 자신에게 말했습니다 - 당신의 명령형 알고리즘은 간단하고 상대적으로 간단합니다. (당신이 필요로하지 않기 때문에 두 번째 중첩 된 것을 제거 할 것입니다). 그것은 기능적인 재 작성으로부터 이익을 얻지 못할 것이고, 대부분은 복잡성을 얻을 것이다. (예를 들어 기능적인 구현에는'Tuple' 클래스가 필요할 것이다.) –

답변

3

자바 9에서는이 null 값 (있는 경우)의 발생 전까지의 모든 비 null 값 드롭 논리 제 간단

if(path.stream().dropWhile(Objects::nonNull).anyMatch(Objects::nonNull)) 
    throw new Exception("Invalid path"); 

사용할 수있다, 그리고, 모든 비 경우 실패 null 값이옵니다.

Java 8에는 the dropWhile operation이 없으므로 대체 작업을 앞에 붙여야합니다. 스트림 API 대신 컬렉션 API 사용 :

int firstNull = path.indexOf(null); 
if(firstNull>=0 && path.stream().skip(firstNull).anyMatch(Objects::nonNull)) 
    throw new Exception("Invalid path"); 
+0

Java-8의 최고 사용자 중 한 명인 것처럼 Java-9 기능에 대한 링크를 제공해 주시겠습니까? :) –

+2

@ 주드 Niroshan : 여기 있네. – Holger