タグ付けされた質問 「java-8」

このタグは、2014年3月18日にリリースされたJavaプラットフォームのバージョン8(内部番号1.8)であるJava 8に固有の質問に使用します。ほとんどの場合、javaタグも指定する必要があります。

9
Java SE 8にはペアまたはタプルがありますか?
Java SE 8で遅延関数操作をいじってmapいます。iペア/タプルへのインデックスを作成し(i, value[i])、次にfilter2番目のvalue[i]要素に基づいて、最後にインデックスのみを出力します。 私はまだこれに苦しむ必要があります:JavaのC ++ Pair <L、R>に相当するものは何ですか?ラムダとストリームの大胆な新時代に? 更新:かなり単純化した例を紹介しました。これには、@ dkatzelが提供するきちんとしたソリューションが含まれています。ただし、一般化されません。したがって、より一般的な例を追加します。 package com.example.test; import java.util.ArrayList; import java.util.stream.IntStream; public class Main { public static void main(String[] args) { boolean [][] directed_acyclic_graph = new boolean[][]{ {false, true, false, true, false, true}, {false, false, false, true, false, true}, {false, false, false, true, false, true}, …

3
ラムダ式は、実行されるたびにヒープ上にオブジェクトを作成しますか?
次のようなJava 8の新しい構文シュガーを使用してコレクションを反復処理すると、 myStream.forEach(item -> { // do something useful }); これは、以下の「古い構文」スニペットと同等ではありませんか? myStream.forEach(new Consumer<Item>() { @Override public void accept(Item item) { // do something useful } }); これはConsumer、コレクションを反復処理するたびに、新しい匿名オブジェクトがヒープ上に作成されることを意味しますか?これにはどのくらいのヒープ領域が必要ですか?パフォーマンスにどのような影響がありますか?大規模なマルチレベルのデータ構造を反復処理するときに、ループに古いスタイルを使用する必要があるということですか?
182 java  lambda  java-8 

9
Java8ラムダを使用してストリームを逆順にソートする方法は?
リストをソートするためにjava lambdaを使用しています。 逆に並べ替えるにはどうすればよいですか? この投稿を見ましたが、Java 8ラムダを使用したいと思います。 これがハックとしての私のコードです(私は* -1を使用しました)。 Arrays.asList(files).stream() .filter(file -> isNameLikeBaseLine(file, baseLineFile.getName())) .sorted(new Comparator<File>() { public int compare(File o1, File o2) { int answer; if (o1.lastModified() == o2.lastModified()) { answer = 0; } else if (o1.lastModified() > o2.lastModified()) { answer = 1; } else { answer = -1; } return …

4
標準のKotlinライブラリで利用できるJava 8 Stream.collectの同等のものは何ですか?
Java 8では、Stream.collectコレクションの集約を可能にするものがあります。Kotlinでは、おそらくstdlibの拡張関数のコレクションとして以外は、これは同じ方法で存在しません。しかし、さまざまなユースケースでの同等性が何であるかは明らかではありません。 たとえば、JavaDocCollectorsの上部には Java 8用に記述された例があり、それらをKolinに移植する場合、異なるJDKバージョンではJava 8クラスを使用できないため、異なる方法で記述する必要があります。 Kotlinコレクションの例を示すオンラインのリソースに関しては、それらは通常は取るに足らないものであり、実際に同じ使用例と比較することはできません。Java 8用に文書化されているようなケースに本当に一致する良い例は何Stream.collectですか?リストがあります: 名前をリストに蓄積する 名前をTreeSetに蓄積する 要素を文字列に変換し、コンマで区切って連結します 従業員の給与の合計を計算します 部門別のグループ従業員 部門ごとの給与の合計を計算する 生徒を合格と不合格に分ける 上記のリンクのJavaDocの詳細を使用。 注: この質問は、作者が意図的に作成して回答したものであり(自己回答式の質問)、一般的に尋ねられるKotlinトピックに対する慣用的な回答がSOにあります。また、現在のKotlinには正確ではない、Kotlinのアルファ用に書かれたいくつかの本当に古い回答を明確にするためにも。

5
ストリームを使用してBigDecimalを合計する
LinkedList一緒に追加したいBigDecimals(この例では)のコレクションがあります。これにストリームを使用することは可能ですか? Streamクラスにいくつかのメソッドがあることに気づきました Stream::mapToInt Stream::mapToDouble Stream::mapToLong それぞれに便利なsum()方法があります。しかし、私たちが知っているようにfloat、double算術はほとんど常に悪い考えです。 それでは、BigDecimalsを合計する便利な方法はありますか? これは私がこれまでに持っているコードです。 public static void main(String[] args) { LinkedList<BigDecimal> values = new LinkedList<>(); values.add(BigDecimal.valueOf(.1)); values.add(BigDecimal.valueOf(1.1)); values.add(BigDecimal.valueOf(2.1)); values.add(BigDecimal.valueOf(.1)); // Classical Java approach BigDecimal sum = BigDecimal.ZERO; for(BigDecimal value : values) { System.out.println(value); sum = sum.add(value); } System.out.println("Sum = " + sum); // Java 8 approach …

7
Java 8:ストリームで例外をスローするメソッドを使用するにはどうすればよいですか?
クラスとメソッドがあるとします class A { void foo() throws Exception() { ... } } ここで、次のようなAストリームによって配信されるインスタンスごとにfooを呼び出します。 void bar() throws Exception { Stream<A> as = ... as.forEach(a -> a.foo()); } 質問:例外を適切に処理するにはどうすればよいですか?foo()によってスローされる可能性のある例外を処理していないため、コードがマシンでコンパイルされません。のthrows Exceptionはbarここでは役に立たないようです。何故ですか?

2
一般的な戻り値の型の上限-インターフェイスとクラス-驚くほど有効なコード
これは、サードパーティのライブラリAPIからの実際の例ですが、簡略化されています。 Oracle JDK 8u72でコンパイル 次の2つの方法を検討してください。 <X extends CharSequence> X getCharSequence() { return (X) "hello"; } <X extends String> X getString() { return (X) "hello"; } どちらも「チェックされていないキャスト」警告を報告します-理由はわかります。私を困惑させるのは、なぜ私が電話できるのか Integer x = getCharSequence(); そしてそれはコンパイルしますか?コンパイラは、Integerがを実装していないことを知っている必要がありますCharSequence。への呼び出し Integer y = getString(); エラーを出します(予想通り) incompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String この動作が有効と見なされる理由を誰かが説明できますか?それはどのように役立ちますか? クライアントは、この呼び出しが安全でないことを認識していません-クライアントのコードは警告なしでコンパイルされます。コンパイルがそのことを警告しない、またはエラーを発行しないのはなぜですか? また、この例との違いは次のとおりです。 <X …
171 java  generics  java-8 

6
Java 8ストリームAPIでカウントしてグループ化する
Java 8ストリームAPIでグループ化を行う簡単な方法を見つけようとすると、この複雑な方法が出てきます。 List<String> list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map<String, List<String>> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); List<String[]> collect2 = collect .entrySet() .stream() .map(e -> new String[] { e.getKey(), String.valueOf(e.getValue().size()) }) .collect(Collectors.toList()); collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1])); 私はあなたの入力に感謝します。

5
矢印演算子「->」はJavaで何をしますか?
矢印演算子に出くわしたコードを探している間、正確には何をしているのですか?Javaには矢印演算子がないと思いました。 return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> { return Car.SEDAN == ((Car)arg0).getStyle(); }); 詳細:Java 6、Apache Commons Collection、IntelliJ 12 更新/回答: IntelliJ 12がラムダをサポートするJava 8をサポートし、述語を「折りたたみ」、ラムダとして表示していることがわかりました。以下は「展開された」コードです。 return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() { public boolean evaluate(Object arg0) { return Car.SEDAN == ((Car)arg0).getStyle(); } });

15
Java 8:Lambda-Streams、例外付きのメソッドでフィルター
Java 8のLambda式を試してみるのに問題があります。通常は問題なく動作しますが、今ではをスローするメソッドがありIOExceptionます。次のコードを確認すると最適です。 class Bank{ .... public Set<String> getActiveAccountNumbers() throws IOException { Stream<Account> s = accounts.values().stream(); s = s.filter(a -> a.isActive()); Stream<String> ss = s.map(a -> a.getNumber()); return ss.collect(Collectors.toSet()); } .... } interface Account{ .... boolean isActive() throws IOException; String getNumber() throws IOException; .... } 問題は、コンパイルされないことです。これは、isActive-およびgetNumber-Methodsの起こり得る例外をキャッチする必要があるためです。しかし、以下のようにtry-catch-Blockを明示的に使用しても、例外をキャッチしないため、コンパイルされません。したがって、JDKにバグがあるか、これらの例外をキャッチする方法がわかりません。 class Bank{ .... //Doesn't compile …

8
Intellij-新しいJava 8クラスを使用できない-エラー:「APIの使用方法が@since 1.6以降として文書化されています。」
java.lang.function.FunctionJava 8コードベースでを使用しようとしていますが、Intellijで次のエラーが発生します。 @since 1.6+として文書化されたAPIの使用法この検査では、ドキュメントに@sinceタグが含まれるメソッドのすべての使用法が検出されます。これは、本番用のターゲットプラットフォームとして新しいSDKバージョンで開発を実行する場合に役立ちます。 プロジェクトとコンパイラの設定が正しいようです プロジェクト設定:(ファイル->プロジェクト構造) Project Settings -> Project -> Project SDK = Java 1.8 Project Settings -> Project -> Project Language Level = 8 - Lambdas, Type Annotations etc コンパイラ設定:(ファイル->設定) Build, Execution, Deployment -> Compiler -> Java Compiler -> Project Bytecode Version : 1.8 Build, Execution, Deployment -> …

8
2つのJava 8ストリーム、またはストリームへの追加要素の追加
次のように、ストリームまたは追加の要素を追加できます。 Stream stream = Stream.concat(stream1, Stream.concat(stream2, Stream.of(element)); そして、次のように、新しいものを追加することができます。 Stream stream = Stream.concat( Stream.concat( stream1.filter(x -> x!=0), stream2) .filter(x -> x!=1), Stream.of(element)) .filter(x -> x!=2); しかし、concat静的であるため、これは醜いです。場合はconcat、インスタンスメソッドあったが、上記の例では、より読みやすいでしょう。 Stream stream = stream1.concat(stream2).concat(element); そして Stream stream = stream1 .filter(x -> x!=0) .concat(stream2) .filter(x -> x!=1) .concat(element) .filter(x -> x!=2); 私の質問は: 1)concat静的である理由はありますか?それとも私が見逃している同等のインスタンスメソッドがありますか? 2)いずれにしても、これを行うより良い方法はありますか?


9
コレクションまたはストリームを返す必要がありますか?
メンバーリストに読み取り専用ビューを返すメソッドがあるとします。 class Team { private List < Player > players = new ArrayList < > (); // ... public List < Player > getPlayers() { return Collections.unmodifiableList(players); } } さらに、クライアントが行うことはすべて、リストを1回、即座に繰り返すことであると想定します。プレーヤーをJListか何かに入れるかもしれません。クライアントは後の検査のためにリストへの参照を保存しません! この一般的なシナリオでは、代わりにストリームを返す必要がありますか? public Stream < Player > getPlayers() { return players.stream(); } または、Javaで非慣用的なストリームを返していますか?ストリームは、それが作成された同じ式内で常に「終了」するように設計されていましたか?


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.