[英]Java: iterating through list of lists?
問題,但在C#。 那么Java有C#的命令嗎? 我需要它用於Matches-SearchTerm-Files-relationship。
foreach(var i in BunchOfItems.SelectMany(k => k.Items)) {}
[為什么不for循環?]我已經在嵌套for循環中完成了這樣的結構,但它們很快變得臃腫。 所以我更喜歡像上面這樣的更多傻瓜。
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;
}
for (List<Object> lo : list) {
for (Object o : lo) {
// etc etc
}
}
我不認為有一個更簡單的解決方案。
如果您可以將數據轉換為Iterable<Iterable<T>>
,那么您可以使用Guava的Iterables.concat
方法從中獲得平坦的Iterable<T>
。 如果你擁有的是一個Iterable<S>
,有一些方法可以從S
到Iterable<T>
,那么你必須首先使用Iterables.transform
來查看它作為Iterable<Iterable<T>>
concat
需要。
如果Java有類似閉包的東西,所有這些看起來會更好,但至少在今天它是可能的。
使用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
。
我有自己的版本。 拼命地等待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();
}
}
用法:
Iterable<SomeType> result = transformMany(input, new Func<InputType, Iterable<SomeType>>() {
@Override
public Iterable<SomeType> execute(InputType e) {
return new ArrayList<SomeType>();
}
});
SelectMany方法是LINQ的一部分,它是.Net特定的。 這個問題詢問了java的LINQ等價。 不幸的是,它看起來並不像是直接的等價物。
有大約半年的耐心,直到JDK7最終將包括閉包 。 這提供了類似於LINQ的語法和相同的可能性,這在您正在討論的答案中得到了證明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.