2010-05-06 3 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

Уже около полугода терпения, пока JDK7 не является окончательным, который будет включать в себя Closures. Это обеспечивает простой синтаксис и те же возможности, что и LINQ, который был продемонстрирован в ответе, о котором вы говорите.

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

Я не думаю, что есть более простое решение.

+0

ОП запрашивает решение типа Linq, которое предоставляет C#. Он уже знает, как выполнять итерацию через списки. Он хочет элегантное решение. К сожалению, Java не имеет чего-то эквивалентного Linq. –

1

У меня есть своя версия. Ожидание отчаянно Closures в Java:

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(); 
    } 

} 

Usage:

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

Метод SelectMany является частью LINQ, которая является .Net-специфичны. This question спрашивает о LINQ equilvalent для java. К сожалению, это не похоже на прямой эквивалент.

6

Если вы можете получить данные в Iterable<Iterable<T>>, вы можете получить от этого до сплющенного Iterable<T> с использованием метода Guava's Iterables.concat. Если у вас действительно есть Iterable<S>, с каким-то образом можно добраться от S до Iterable<T>, ну, тогда вы должны сначала использовать Iterables.transform, чтобы посмотреть, что в качестве Iterable<Iterable<T>> требуется concat.

Все это будет выглядеть намного приятнее, если и когда Java что-то напоминает закрытия, но по крайней мере сегодня это возможно.

http://guava-libraries.googlecode.com

3

С Java 8, вы можете сказать,

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.

Смежные вопросы