java.util.stream.StreamのメソッドとScalaの対応

またJava8の話。
Scalaの場合、ListでもStream*1でもVectorでも同じメソッドあるので、あえてどのclassなのかは明示しません。基本はJavadoc読んで雑に調べただけで、ちゃんと全部実行して試したわけじゃないので、明らかに間違ってたら教えて下さい。

http://download.java.net/lambda/b88/docs/api/java/util/stream/Stream.html
http://hg.openjdk.java.net/lambda/lambda/jdk/file/38379cea9127/src/share/classes/java/util/stream/Stream.java

Scalaとメソッド名も機能だいたい同じもの
  • filter
  • map
  • flatMap
  • distinct
  • iterator
  • toArray
    • Javaのほうの引数なしの方は、戻り値型がObject[]で残念
  • min
    • JavaのほうはOptionalを返すので、Scalaより型安全!?。Comparatorを明示的に渡さないといけない
  • max
    • minと同様
  • count
    • Javaのほうはintではなくlong返すらしい
  • Stream sorted()
    • TがComparableじゃない場合、ClassCastExceptionを投げるの・・・
  • Stream sorted(Comparator comparator)
    • Comparatorを明示的にわたすversion
Scalaに直接対応するものが存在しない(?)もの
  • unordered
  • peek
    • 副作用専用メソッド?
  • forEachOrdered
    • 順序に関する考え方がScalaと違うというか、java.util.stream.Streamは最初からpipeline的な処理をするため専用に作られてるので、たんにsortしてからforeach呼ぶのとも違うみたい?・・・(つまりよくわかってない)
  • noneMatch
    • anyMatch(scalaだとexists)の逆?
  • <U> U reduce(U identity,BiFunction accumulator,BinaryOperator<U> combiner)
    • 多分ない・・・はず。ただ最終目的としては、ほかのreduceと同様に、Scalaのreduce、reduceOptionもしくはfoldと同じみたい。使い方よくわかってないのであとで気が向いたら調べる
  • collect
    • 結局ScalaでのreduceLeftとかfoldLeft的なことがやりたい?でいいのか?
    • 引数が3つのほうは、おそらく効率のために、buffer的なものや、BiConsumer(ScalaだとFunction2[A,B,Unit])などを引数にとって、mutableな操作で結果値を生成する感じ
  • isParallel
    • 型で判別すれば、Scalaでもできる?
  • spliterator
    • Spliterator がなんなのかよくわかってないのであとで
  • <A> A toArray(IntFunction> generator)
    • type erasureの関係で存在かな?(Scalaだったらそういうの勝手にやってくれる)明示的に返すArrayそのものを作成して渡さないといけないらしい。シグネチャや使い方は全然違うが、目的としてはScalaのtoArrayと同じだと思う
IntとLongとDoubleの場合それぞれあるもの
  • mapToInt
  • mapToLong
  • mapToDouble
  • flatMapToInt
  • flatMapToLong
  • flatMapToDouble
メソッド名が異なる(けど機能はほぼ同じ)もの
Java8 Scala 補足コメント
limit take
sequential seq
parallel par
Stream substream(long startInclusive) drop
Stream substream(long startInclusive, long endExclusive) slice
forEach foreach
T reduce(T identity,BinaryOperator accumulator) fold
Optional reduce(BinaryOperator accumulator) reduceOption
anyMatch exists
allMatch forall
findFirst headOption sortの考え方がちがうみたいなので、概念的に本当に直接対応するのかよくわかってない
findAny headOption findFirstと型は全く同じ。気が向いたらfindFirstとfindAnyの違いしらべる・・・
static メソッド
  • builder
    • Scalaに対応するものがあるといえばあるが・・・
  • empty
    • コンパニオンオブジェクトに同じ名前で存在
  • of
    • Scalaの場合apply。引数1つのやつはsingle
  • iterate
    • コンパニオンオブジェクトに同じ名前で存在
  • generate
    • Scalaの場合continually*2

あと、ListやSetやMapに変換とか、maxByやminByなどは、CollectorsというオブジェクトのstaticメソッドとしてCollector型で用意してあるみたいですね

http://download.java.net/lambda/b88/docs/api/java/util/stream/Collectors.html

*1:scala.collection.immutable.Streamのこと

*2:無限になるので、IteratorとStreamのみに存在