2010-05-06 5 views
6

The question but in C#. Java에는 C#의 명령이 있습니까? Matches-SearchTerm-Files- 관계에 필요합니다.Java : 목록 목록을 반복합니다.

foreach(var i in BunchOfItems.SelectMany(k => k.Items)) {} 

[왜를위한 루프?] 내가 루프 중첩 된 이러한 구조를했을하지만 곧 부풀어 될 . 그래서 저는 위와 같이 좀 더 숙련 된 것을 선호합니다.

public static Stack<Integer[]> getPrintPoss(String s,File f,Integer maxViewPerF) 
{ 
    Stack<File> possPrint = new Stack<File>(); 
    Integer[] poss = new Integer[4](); 
    int u,size; 
    for(File f:files) 
    { 
     size = f2S(f).length(); 
     u = Math.min(maxViewsPerF,size); 
     for(int i=0; i<u;i++) 
     { 
      // Do something --- bloated, and soon out of control 
      // wants more succintly 

     } 
    } 
    return possPrint; 
} 
+1

이 라이브러리에는 요구 사항에 따라 다음과 같은 selectMany() 구현이 있습니다. for (val i : BunchOfItems.selectMany (bunchItemSelector()) {}. https://github.com/nicholas22/jpropel-light를 참조하십시오. –

답변

1

약 반 년 인내심을 가지고. 이것은 당신이 이야기하고있는 대답에서 보여준 LINQ와 똑같은 가능성과 비슷한 구문을 제공합니다.

자바 8
6
for (List<Object> lo : list) { 
    for (Object o : lo) { 
     // etc etc 
    } 
} 

나는 간단한 해결책이 있다고 생각하지 않습니다.

+0

OP는 C#에서 제공하는 Linq 유형의 솔루션을 요구하고 있습니다. 그는 이미 List를 반복하는 방법을 알고 있습니다. 그는 우아한 솔루션을 원합니다. 불행히도 Java에는 Linq와 같은 것이 없습니다. –

1

내 버전이 있습니다.

public static <T, E> Iterable<T> transformMany(Iterable<E> iterable, Func<E, Iterable<T>> f) { 
    if (null == iterable) 
     throw new IllegalArgumentException("null iterable"); 
    if (null == f) 
     throw new IllegalArgumentException("null f"); 

    return new TransformManyIterable<E, T>(iterable, f); 
} 

public interface Func<E, T> { 
    T execute(E e); 
} 

public class TransformManyIterable<TOriginal, TResult> implements Iterable<TResult> { 
    private Iterable<TOriginal> iterable; 
    private Func<TOriginal, Iterable<TResult>> func; 

    public TransformManyIterable(Iterable<TOriginal> iterable, 
      Func<TOriginal, Iterable<TResult>> func) { 
     super(); 
     this.iterable = iterable; 
     this.func = func; 
    } 

    class TransformIterator implements Iterator<TResult> { 
     private Iterator<TOriginal> iterator; 
     private Iterator<TResult> currentIterator; 

     public TransformIterator() { 
      iterator = iterable.iterator(); 
     } 

     @Override 
     public boolean hasNext() { 
      if (currentIterator != null && currentIterator.hasNext()) 
       return true; 
      else { 
       while (iterator.hasNext()) { 
        Iterable<TResult> iterable = func.execute(iterator.next()); 
        if (iterable == null) 
         continue; 
        currentIterator = iterable.iterator(); 
        if (currentIterator.hasNext()) 
         return true; 
       } 
      } 

      return false; 
     } 

     @Override 
     public TResult next() { 
      if (currentIterator != null && currentIterator.hasNext()) 
       return currentIterator.next(); 
      else { 
       while (iterator.hasNext()) { 
        Iterable<TResult> iterable = func.execute(iterator.next()); 
        if (iterable == null) 
         continue; 
        currentIterator = iterable.iterator(); 
        if (currentIterator.hasNext()) 
         return currentIterator.next(); 
       } 
      } 
      throw new NoSuchElementException(); 
     } 

     @Override 
     public void remove() { 
      throw new UnsupportedOperationException(); 
     } 
    } 

    @Override 
    public Iterator<TResult> iterator() { 
     return new TransformIterator(); 
    } 

} 

사용법 :

Iterable<SomeType> result = transformMany(input, new Func<InputType, Iterable<SomeType>>() { 
     @Override 
     public Iterable<SomeType> execute(InputType e) { 
      return new ArrayList<SomeType>(); 
     } 
    }); 
1

SelectMany 방법은 닷넷 고유 LINQ의 일부입니다 폐쇄 자바 위해 필사적으로 대기. This question은 Java에 대해 평등 한 LINQ를 묻습니다. 불행히도 직접적인 동일한 기능이없는 것처럼 보입니다.

6

데이터를 Iterable<Iterable<T>>으로 가져올 수 있다면 Guava의 Iterables.concat 방법을 사용하여 평탄화 된 Iterable<T>으로 가져올 수 있습니다. 가지고있는 항목이 실제로 Iterable<S>이고 어떤 방법으로 S에서 Iterable<T>으로가는 경우 이 필요하고 concat으로 표시하려면 먼저 Iterables.transform을 사용해야합니다.

자바가 클로저와 비슷하지만 적어도 오늘은 가능할 때 훨씬 더 멋지게 보일 것입니다. JDK7가 Closures을 포함하는 최종까지

http://guava-libraries.googlecode.com

3

, 당신은

Collection bunchOfItems = ...; 
bunchOfItems.stream().flatMap(k::getItems).forEach(i -> /* operate on i */); 

또는

Item[] bunchOfItems = ...; 
Stream.of(bunchOfItems).flatMap(k::getItems).forEach(i -> /* operate on i */); 

당신이 Collection 또는 Array이 있는지 여부에 따라 말할 수 있습니다.

관련 문제