5

for次のステートメントを Java 8 ストリーム (つまり)に変換したいと思いStream<Class<?>>ます。File.getParentFile()理想的な解決策は、リンクされたリストをトラバースするさまざまな状況 (例: )に簡単に適応できるほど単純なものですComponent.getParent()

  Class<?> clazz;
  Object value;

  value = ...;

  for (clazz = value.getClass(); clazz != null; clazz = clazz.getSuperclass())
     ...

ストリームを作成するための数行のコードは、単一のforステートメントよりも単純ではないことに気付きました。ただし、ストリームを使用するとforループの本体が単純になるため、ストリームの方が望ましいと言えます。

4

2 に答える 2

1

これは、質問で提示されたものと同じコードですが、を使用して実装されていSpliteratorます。誰かがよりシンプルでスマートな答えを思いつくことを願っています。

  Class<?> clazz;
  Object value;

  value = ...;

  <Class<?>>walkLinks(value.getClass(), Class::getSuperclass).
     ...


public static <T> Stream<T> walkLinks(T start, Function<T, T> next)
{
   WalkLinks<T> walker;
   Stream<T> result;

   walker = new WalkLinks<>(start, next);
   result = StreamSupport.stream(walker, false);

   return(result);
}

private static class WalkLinks<T> extends Spliterators.AbstractSpliterator<T>
{
   private final Function<T, T> m_next;
   private       T              m_value;

   public WalkLinks(T value, Function<T, T> next)
   {
      super(Long.MAX_VALUE, Spliterator.ORDERED + Spliterator.NONNULL);

      m_value = value;
      m_next  = next;
   }

   @Override
   public boolean tryAdvance(Consumer<? super T> action)
   {
      if (m_value == null)
         return(false);

      action.accept(m_value);

      m_value = m_next.apply(m_value);

      return(true);
   }
}
于 2016-01-22T22:04:41.747 に答える