我试着在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]));
Run Code Online (Sandbox Code Playgroud)
我很感激你的意见.
我在Java 8中遇到了一个名为Functional Interface的新术语.
在使用lambda表达式时,我只能找到一个使用此接口的方法.
Java 8提供了一些内置的功能接口,如果我们想要定义任何功能接口,那么我们就可以使用@FunctionalInterface
注释.它允许我们在接口中只声明一个方法.
例如:
@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)
除了使用lambda表达式之外,它在Java 8中有多大用处?
这里的问题与我提出的问题不同.在使用Lambda表达式时,它询问为什么我们需要功能接口.我的问题是:为什么使用功能接口而不是直接使用lambda表达式?
我已经阅读了文档,但是当我应该使用其中一个时,我仍然无法获得:
根据文档OffsetDateTime
应该在将日期写入数据库时使用,但我不明白为什么.
在带有lambda b93的JDK 8中,b93中有一个类java.util.stream.Streams.zip可用于压缩流(这在教程Exploring Java8 Lambdas中说明.Dhananjay Nene的第1部分).这个功能:
创建一个惰性和顺序组合Stream,其元素是组合两个流的元素的结果.
然而在b98中,这已经消失了.事实上,在b98Streams
中的java.util.stream中甚至无法访问该类.
是否已移动此功能,如果是这样,我如何使用b98简洁地压缩流?
我想到的应用程序是在Shen的这个java实现中,我在其中替换了zip中的zip功能
static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
具有相当冗长代码的函数(不使用b98中的功能).
lambda functional-programming lazy-evaluation java-8 java-stream
在Java中,是否可以让lambda接受多种不同的类型?
即:单变量工作:
Function <Integer, Integer> adder = i -> i + 1;
System.out.println (adder.apply (10));
Run Code Online (Sandbox Code Playgroud)
Varargs也有效:
Function <Integer [], Integer> multiAdder = ints -> {
int sum = 0;
for (Integer i : ints) {
sum += i;
}
return sum;
};
//....
System.out.println ((multiAdder.apply (new Integer [] { 1, 2, 3, 4 })));
Run Code Online (Sandbox Code Playgroud)
但是我想要一些可以接受许多不同类型参数的东西,例如:
Function <String, Integer, Double, Person, String> myLambda = a , b, c, d-> {
[DO STUFF]
return "done stuff"
};
Run Code Online (Sandbox Code Playgroud)
主要用途是在函数内部使用小内联函数以方便使用.
我查看了谷歌并检查了Java的功能包,但找不到.这可能吗?
是否可以在Java 8中强制转换流?假设我有一个对象列表,我可以做这样的事情来过滤掉所有其他对象:
Stream.of(objects).filter(c -> c instanceof Client)
Run Code Online (Sandbox Code Playgroud)
在此之后,如果我想对客户做一些事情,我需要投下每个客户:
Stream.of(objects).filter(c -> c instanceof Client)
.map(c -> ((Client) c).getID()).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
这看起来有点难看.是否可以将整个流转换为其他类型?像流延Stream<Object>
到Stream<Client>
?
请忽略这样的事实,即做这样的事情可能意味着糟糕的设计.我们在计算机科学课上做这样的事情,所以我正在研究java 8的新功能,如果可能的话,我很好奇.
收集器的Javadoc显示如何将流的元素收集到新的List中.是否有一个单行程序将结果添加到现有的ArrayList中?
Java 8流是否类似于RxJava observables?
Java 8流定义:
新
java.util.stream
包中的类提供Stream API以支持对元素流的功能样式操作.
这两种方法有什么区别:Optional.flatMap()
和Optional.map()
?
一个例子将不胜感激.
java-8 ×10
java ×8
java-stream ×4
lambda ×3
cloneable ×1
collectors ×1
deprecated ×1
interface ×1
java-time ×1
observable ×1
optional ×1
rx-java ×1