目前,要将a转换List<List<Foo>>为a Stream<Foo>,您必须使用以下内容:
Stream<Foo> stream = list.stream().flatMap(fs -> fs.stream());
//or
Stream<Foo> stream = list.stream().flatMap(Collection::stream);
Run Code Online (Sandbox Code Playgroud)
我认为这正是方法引用的设计目标,它确实提高了可读性.现在考虑一下:
Stream<Bar> stream = list.stream().flatMap(fs -> fs.getBarList().stream());
Run Code Online (Sandbox Code Playgroud)
有两个链式方法调用,没有方法参考是可能的,我已经发生了几次这种情况.虽然这不是一个大问题,但它似乎偏离了方法参考简洁性.
在使用JavaFX 8之后,我注意到它们的API常量是方便的方法.Java是一种非常冗长的语言,在我看来,简单的方法重载是JavaFX的一大卖点.
所以我的问题是,我想知道为什么没有Stream.flatMap(Collection)可以被称为的方便方法:
Stream<Bar> stream = list.stream().flatMap(Foo::getBarList);
Run Code Online (Sandbox Code Playgroud)
这是甲骨文人员故意遗漏的吗?或者这会引起任何混淆吗?
注意:我知道"不基于意见的问题政策",我不是在寻找意见,我只是想知道是否有理由不采用这种方法.
我正在使用Java-8 lambda对列表进行排序.
这是列表
[(t1, tester1), (t4, tester4), (t3, tester3), (t2, tester2)]
Run Code Online (Sandbox Code Playgroud)
排序后
[(t2, tester2), (t1, tester1), (t3, tester3), (t4, tester4)]
Run Code Online (Sandbox Code Playgroud)
我想得到如上所述的结果
String specialId = 't2'
List<Test> list = new ArrayList<>();
Test test1 = new Test();
test1.setId = "t1"
test1.setName = "tester1"
list.add(test1)
Test test2 = new Test();
test2.setId = "t4"
test2.setName = "tester4"
list.add(test2)
Test test3 = new Test();
test3.setId = "t3"
test3.setName = "tester3"
list.add(test3)
Test test4 = new Test();
test4.setId = "t2"
test4.setName = "tester2"
list.add(test4)
Stream<Test> s1 …Run Code Online (Sandbox Code Playgroud) 我正在做一些Java 8流的"代数",也就是说,我正在尝试编写一个简单的操作Op,它将两个流作为输入并产生另一个流.
所以我有这个简单的代码,其目的是在一系列数字中打印secund最高值:
import java.util.Arrays;
import java.util.stream.IntStream;
public class SecundHighestValue {
public static void main(String[] args) {
//setting the input parameters
int [] numbers = {1, 2, 3, 4, 3, 4, 2, 1};
IntStream S1 = Arrays.stream(numbers);
IntStream S2 = Arrays.stream(new int[] {Arrays.stream(numbers).max().getAsInt()} );
// setting the operation
IntStream S3 = S1.filter(x-> x != S2.toArray()[0]); // doesn't work
/*** does work ***
int maxNumber = S2.toArray()[0];
IntStream S3 = S1.filter(x-> x != maxNumber);
*/
// accessing the operation's result stream …Run Code Online (Sandbox Code Playgroud) java functional-programming lazy-evaluation java-8 java-stream
import java.util.Optional;
public class Student {
public long id;
public String firstName;
public Optional<String> middleName;
public String lastName;
.
.
.
public Optional<String> getMiddleName() {
return middleName;
}
}
Student student = new Student();
if (student.getMiddleName().isPresent()) {
System.out.println(student.getMiddleName().get());
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将获得一个,NullPointerException因为Optional类成员值的默认值为null.应该是默认值Optional.empty()吗?
我有一个构建列表的新方法,我希望它将列表的总和作为OptionalDouble值返回.
但是,当我使用Java 8计算总和值时,我总是将返回值作为Double.
我该如何转换?
Double to OptionalDouble
Run Code Online (Sandbox Code Playgroud)
以下是我的和计算代码:
private static OptionalDouble sumListValue() {
// Build list
List<Double> testList = new ArrayList<>();
testList.add(...);
...
...
return testList.stream().mapToDouble(value -> value).sum();
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我想在下面的场景中使用Java 8 Lambda表达式,但我得到的是在封闭范围内定义的局部变量fooCount必须是final或者有效的final.我理解的错误消息说什么,但我需要计算在这里比例,从而需要增加fooCount和barCount再计算百分比.那么实现它的方法是什么:
// key is a String with values like "FOO;SomethinElse" and value is Long
final Map<String, Long> map = null;
....
private int calculateFooPercentage() {
long fooCount = 0L;
long barCount = 0L;
map.forEach((k, v) -> {
if (k.contains("FOO")) {
fooCount++;
} else {
barCount++;
}
});
final int fooPercentage = 0;
//Rest of the logic to calculate percentage
....
return fooPercentage;
}
Run Code Online (Sandbox Code Playgroud)
我有一个选择是在AtomicLong这里使用而不是long但我想避免它,所以稍后如果可能的话我想在这里使用并行流.
我遇到了这个问题:
以下是什么输出?
1 public class A {
2 public static void main(String[] args){
3 I i = new I() {};
4 System.out.println(I.x + i.getValue() + "" + i);
5 }
6 }
7
8 interface I {
9 int x = 10;
10
11 public default int getValue() {
12 return 5;
13 }
14
15 public default String toString() {
16 return "I";
17 }
18 }
Run Code Online (Sandbox Code Playgroud)
我的想法:
我的第一直觉告诉我 - 我是新的我(){}?因此我们无法实例化接口 - 问题1.
然后我认为公共默认String toString()?重写Object类方法?问题听起来不错 - …
在java.time软件包中,我没有看到获取可用时区ID列表的函数。我能够调用getAvailableIDs()的java.util.TimeZone库。但是,我想改用Java 8。
有没有办法做到这一点?
我目前有一个这样的if语句:
if (condition1 || condition2) {
//Do stuff here
//Small things happened here
//More stuff
if (condition1) {
System.out.println("Thank");
// Do Task Alpha
// Do Task Beta
} else {
System.out.println("You");
// Do Task Delta
// Do Task Gamma
}
}
Run Code Online (Sandbox Code Playgroud)
所以基本的想法是当任一条件为真时发生if语句(在我的情况下,两个条件不能同时为真).
但是,一旦在if语句中,有一个点,如果第一个条件为真,则打印"Thank"并执行Task Alpha和Beta.如果第二个条件为真,则打印"你"并执行任务Delta和Gamma.在我们达到这个分歧点之前,会执行许多常见的陈述.
这是编写整个if语句的最佳/最简单的方法吗?
谢谢.
我有List<Person> persons = new ArrayList<>();,我想列出所有独特的名字.我的意思是如果有"John","Max","John","Greg"那么我只想列出"Max"和"Greg".有没有办法用Java流做到这一点?
java ×10
java-8 ×10
java-stream ×4
lambda ×2
final ×1
if-statement ×1
interface ×1
object ×1
optional ×1
overloading ×1
sum ×1