我想知道是否有一種方法可以使以下代碼的前兩行在 Java 中成為單行代碼,以便object在一行中宣告、分配和檢查 null:
Object object;
if ((object = queue.poll()) != null) {
// do something with object
}
uj5u.com熱心網友回復:
如果您不介意將物件變數的范圍限制在大括號中的代碼中,那么您可以這樣做:
for (Object object; (object = queue.poll()) != null;) {
// do whatever with object
break;
}
這與我們在讀取檔案時所做的典型事情相差不遠,如下所示:
for (String line; (line = reader.readLine()) != null;) {
// do something with line
}
或者按照 rzwitserloot 的建議:
for (Object object = queue.poll; object != null; object = null) {
// do something with object
}
這樣它只輪詢一次,并且省略回圈體中的中斷并沒有害處。在增量中清空物件可確保回圈在第一次通過后終止。
在你無意回圈的情況下使用 for 回圈是一種濫用。我會繼續使用您開始使用的多行版本。
但是,如果您正在輪詢,通常無論如何您都需要一個回圈。
uj5u.com熱心網友回復:
可能不太好看:
Optional.ofNullable(queue.poll())
.ifPresent(object -> ... do something with object ...);
或者
Optional.ofNullable(queue.poll()).ifPresent(object -> {
... do something with object ...;
});
所以你可能對順子有更好的看法:
Object object = queue.poll();
if (object != null) {
// do something with object
}
uj5u.com熱心網友回復:
條件有點做作。因此,很難在不誤用某些東西的情況下滿足要求,比如用optionalnull隱藏-check ,這不是為此目的而設計的。
實際上,以下代碼將是最簡單和最有表現力的:
Object object = queue.poll()
if (object != null) {
// do something with object
}
消除單行會產生成本——代碼的可讀性。
我想出的方法是使用Stream.ofNullable()which 將產生一個空流,如果提供的引數是null. 然后將流轉換為迭代器并在其上呼叫forEachRemaining()。此方法需要 a Supplier,您可以通過放置 - 陳述句中的邏輯if或單獨定義它。
Stream.ofNullable(queue.poll()).iterator().forEachRemaining(System.out::println);
注意:forEach()定義的方法Stream,以便與Stream API 檔案中關于副作用的指南保持一致。而是使用anIterator,因為它的方法沒有這樣的要求forEachRemaining()。
uj5u.com熱心網友回復:
把你poll()變成供應商,假裝你在用一種鼓勵猴子修補的語言作業
Supplier<Optional<Object>> spout = () -> Optional.ofNullable(queue.poll());
spout.get().ifPresent(o -> System.out.println(o));
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/460390.html
