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

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

6
ワンライナーでストリーム/リストの最後の要素を取得する
次のコードでストリームまたはリストの最後の要素を取得するにはどうすればよいですか? どこdata.careasでList<CArea>: CArea first = data.careas.stream() .filter(c -> c.bbox.orientationHorizontal).findFirst().get(); CArea last = data.careas.stream() .filter(c -> c.bbox.orientationHorizontal) .collect(Collectors.toList()).; //how to? ご覧のとおり、最初の要素を特定filterので取得することは難しくありません。 ただし、ワンライナーの最後の要素を取得するのは本当に大変です。 から直接入手できないようStreamです。(それは有限のストリームに対してのみ意味があります) また、インターフェイスのようなものを取得できないようfirst()で、これは本当に苦痛です。last()List インターフェース内にfirst()とlast()メソッドを提供しないことについてはList、そこにある要素が順序付けられており、サイズがわかっているため、私は何の議論も見ていません。 しかし、元の答えのとおり:有限の最後の要素を取得する方法はStream? 個人的に、これは私が得ることができる最も近いものです: int lastIndex = data.careas.stream() .filter(c -> c.bbox.orientationHorizontal) .mapToInt(c -> data.careas.indexOf(c)).max().getAsInt(); CArea last = data.careas.get(lastIndex); ただしindexOf、すべての要素でon を使用する必要があります。これは、パフォーマンスを損なう可能性があるため、通常は必要ない可能性があります。
118 java  list  java-8  java-stream 

3
新しい日時APIを使用して日付をフォーマットする
私は新しい日付時間APIで遊んでいましたが、これを実行すると: public class Test { public static void main(String[] args){ String dateFormatted = LocalDate.now() .format(DateTimeFormatter .ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println(dateFormatted); } } それは投げます: Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay at java.time.LocalDate.get0(LocalDate.java:680) at java.time.LocalDate.getLong(LocalDate.java:659) at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543) at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182) at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745) at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719) at java.time.LocalDate.format(LocalDate.java:1685) at Test.main(Test.java:23) LocalDateクラスのソースコードを見ると、次のことがわかります。 private int …

1
特性としてのJava 8のデフォルトメソッド:安全?
デフォルトのメソッドを Java 8の貧困層の特性のトレイトとして使用することは安全な方法ですか? パンダをそれだけで使うと悲しいかもしれないと主張する人もいます。クールだからですが、それは私の意図ではありません。また、APIの進化と下位互換性をサポートするためにデフォルトのメソッドが導入されたこともよく思い出されますが、これは、それ自体を特性として使用することを間違ったり、歪ませたりするものではありません。 私が持っている以下の実用的なユースケースを念頭に置きました: public interface Loggable { default Logger logger() { return LoggerFactory.getLogger(this.getClass()); } } または、次のように定義しますPeriodTrait。 public interface PeriodeTrait { Date getStartDate(); Date getEndDate(); default isValid(Date atDate) { ... } } 確かに、コンポジションを使用することもできます(ヘルパークラスを使用することもできます)が、より冗長で雑然としており、ポリモーフィズムの恩恵を受けることができません。 では、デフォルトのメソッドを基本的な特性として使用しても問題ありませんか?それとも、予期しない副作用について心配する必要がありますか? SOに関するいくつかの質問は、JavaとScalaの特性に関連しています。それはここでのポイントではありません。私も単に意見を求めるのではありません。代わりに、私は信頼できる回答または少なくともフィールドインサイトを探しています。企業プロジェクトの特性としてデフォルトの方法を使用した場合、それは時限爆弾であることが判明しましたか?

4
新しいcomputeIfAbsent関数を使用するにはどうすればよいですか?
Map.computeIfAbsentを使用したいのですが、学部のラムダ式になってから時間がかかりすぎています。 ほぼドキュメントから直接:物事を行う古い方法の例を示します: Map<String, Boolean> whoLetDogsOut = new ConcurrentHashMap<>(); String key = "snoop"; if (whoLetDogsOut.get(key) == null) { Boolean isLetOut = tryToLetOut(key); if (isLetOut != null) map.putIfAbsent(key, isLetOut); } そして新しい方法: map.computeIfAbsent(key, k -> new Value(f(k))); しかし、彼らの例では、私は完全に「理解している」とは思っていません。これを表現する新しいラムダの方法を使用するようにコードをどのように変換しますか?

11
ラムダ内からローカル変数を変更する
でローカル変数を変更するとforEach、コンパイルエラーが発生します。 正常 int ordinal = 0; for (Example s : list) { s.setOrdinal(ordinal); ordinal++; } ラムダと int ordinal = 0; list.forEach(s -> { s.setOrdinal(ordinal); ordinal++; }); これを解決する方法はありますか?
115 java  lambda  java-8 

6
ラムダ式を使用してstream()。map(…)をデバッグする方法は?
私たちのプロジェクトでは、Java 8に移行し、その新機能をテストしています。 私のプロジェクトでは、Guava述語と関数を使用してCollections2.transform、およびを使用して一部のコレクションをフィルター処理および変換していCollections2.filterます。 この移行では、たとえばguavaコードをjava 8に変更する必要があります。つまり、私が行っている変更は次のようなものです。 List<Integer> naturals = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10,11,12,13); Function <Integer, Integer> duplicate = new Function<Integer, Integer>(){ @Override public Integer apply(Integer n) { return n * 2; } }; Collection result = Collections2.transform(naturals, duplicate); に... List<Integer> result2 = naturals.stream() .map(n -> n * 2) .collect(Collectors.toList()); グアバを使用して、各変換プロセスをデバッグできたので、コードのデバッグは非常に快適でしたが、たとえば、デバッグ方法が心配です.map(n -> n*2)。 デバッガーを使用すると、次のようなコードが表示されます。 @Hidden …
114 java  debugging  lambda  java-8 

2
ラムダ式とメソッドリファレンスの比較[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 6年前休業。 この質問を改善する IntelliJは、ラムダ式をメソッド参照に置き換えることを提案し続けます。 両者の間に客観的な違いはありますか?

4
<JDK8との互換性におけるJavaの三項演算子とif / else
最近、Spring Frameworkのソースコードを読んでいます。理解できないことがここにあります: public Member getMember() { // NOTE: no ternary expression to retain JDK &lt;8 compatibility even when using // the JDK 8 compiler (potentially selecting java.lang.reflect.Executable // as common type, with that new base class not available on older JDKs) if (this.method != null) { return this.method; } else …

7
Java 8:java.util.functionのTriFunction(およびその類)はどこにありますか?または代替は何ですか?
java.util.function.BiFunctionが表示されるので、これを行うことができます。 BiFunction&lt;Integer, Integer, Integer&gt; f = (x, y) -&gt; { return 0; }; それが十分ではなく、TriFunctionが必要な場合はどうなりますか?存在しません! TriFunction&lt;Integer, Integer, Integer, Integer&gt; f = (x, y, z) -&gt; { return 0; }; 私は自分のTriFunctionを定義できることを知っていることを追加する必要があると思います。標準ライブラリに含めない理由を理解しようとしているだけです。
113 java  lambda  java-8 

12
Spring BootのJSON Java 8 LocalDateTime形式
Spring BootアプリケーションでJava 8 LocalDateTimeをフォーマットするときに小さな問題が発生します。「通常の」日付では問題ありませんが、LocalDateTimeフィールドは次のように変換されます。 "startDate" : { "year" : 2010, "month" : "JANUARY", "dayOfMonth" : 1, "dayOfWeek" : "FRIDAY", "dayOfYear" : 1, "monthValue" : 1, "hour" : 2, "minute" : 2, "second" : 0, "nano" : 0, "chronology" : { "id" : "ISO", "calendarType" : "iso8601" } } 私はそれを次のようなものに変換したいのですが: "startDate": …

10
配列/文字列のリストを配列/整数のリストに変換するラムダ式
Java 8には強力なラムダ式が付属しているため、 文字列のリスト/配列を整数、浮動小数点数、倍精度数などの配列/リストに変換する関数を書きたいのですが。 通常のJavaでは、次のように簡単です。 for(String str : strList){ intList.add(Integer.valueOf(str)); } しかし、整数の配列に変換される文字列の配列が与えられた場合、どうやってラムダで同じことを達成できますか?

2
Comparator.reversed()はラムダを使用してコンパイルしません
いくつかのUserオブジェクトを含むリストがあり、リストを並べ替えようとしていますが、メソッド参照を使用した場合にのみ機能します。ラムダ式を使用すると、コンパイラによってエラーが発生します。 List&lt;User&gt; userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -&gt; u.getName())); // works userList.sort(Comparator.comparing(User::getName).reversed()); // works userList.sort(Comparator.comparing(u -&gt; u.getName()).reversed()); // Compiler error エラー: com\java8\collectionapi\CollectionTest.java:35: error: cannot find symbol userList.sort(Comparator.comparing(u -&gt; u.getName()).reversed()); ^ symbol: method getName() location: variable u of type Object 1 error

7
Java8ラムダと匿名クラス
Java8が最近リリースされ、その新しいラムダ式が本当にかっこいいように見えるので、これが私たちがこれまで使用していた匿名クラスの終焉を意味するのかと思っていました。 私はこれについて少し調べていて、Lambda式が体系的にそれらのクラスをどのように置き換えるかについていくつかのクールな例を見つけました。たとえば、コレクションのソートメソッドは、Comparatorの匿名インスタンスを取得してソートを実行するために使用していました。 Collections.sort(personList, new Comparator&lt;Person&gt;(){ public int compare(Person p1, Person p2){ return p1.firstName.compareTo(p2.firstName); } }); 今ラムダを使用して行うことができます: Collections.sort(personList, (Person p1, Person p2) -&gt; p1.firstName.compareTo(p2.firstName)); そして、驚くほど簡潔に見えます。だから私の質問は、ラムダの代わりにJava8でそれらのクラスを使い続ける理由はあるのでしょうか? 編集 同じ質問ですが、反対の方向で、匿名クラスの代わりにラムダを使用する利点は何ですか?ラムダは単一のメソッドインターフェイスでのみ使用できるので、この新しい機能はいくつかの場合にのみ使用されるショートカットだけですか、それとも本当に便利ですか?

4
ラムダ式とジェネリックメソッド
私が一般的なインターフェースを持っているとしましょう: interface MyComparable&lt;T extends Comparable&lt;T&gt;&gt; { public int compare(T obj1, T obj2); } そして方法sort: public static &lt;T extends Comparable&lt;T&gt;&gt; void sort(List&lt;T&gt; list, MyComparable&lt;T&gt; comp) { // sort the list } このメソッドを呼び出して、ラムダ式を引数として渡すことができます。 List&lt;String&gt; list = Arrays.asList("a", "b", "c"); sort(list, (a, b) -&gt; a.compareTo(b)); それはうまくいきます。 しかし、インターフェイスをジェネリックにせず、メソッドをジェネリックにすると、次のようになります。 interface MyComparable { public &lt;T extends …
111 java  generics  lambda  java-8 

3
Java 8の分割で、結果配列の先頭にある空の文字列が削除されることがあるのはなぜですか?
次のように空の文字列で分割するJava 8より前 String[] tokens = "abc".split(""); 分割メカニズムは、でマークされた場所で分割されます | |a|b|c| ""各文字の前後に空白スペースがあるためです。結果として、最初にこの配列が生成されます ["", "a", "b", "c", ""] その後、末尾の空の文字列を削除します(limit引数に負の値を明示的に指定しなかったため)。 ["", "a", "b", "c"] Java 8では、分割メカニズムが変更されたようです。今私たちが使うとき "abc".split("") ["a", "b", "c"]代わりに配列を取得するため["", "a", "b", "c"]、最初の空の文字列も削除されているように見えます。しかし、この理論は失敗します "abc".split("a") startに空の文字列の配列を返します["", "bc"]。 ここで何が起こっているのか、Java 8で分割のルールがどのように変更されたのかを誰かが説明できますか?
110 java  regex  split  java-8 

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