我想使用Java 8的流和lambdas将对象列表转换为Map.
这就是我在Java 7及以下版本中编写它的方法.
private Map<String, Choice> nameMap(List<Choice> choices) {
final Map<String, Choice> hashMap = new HashMap<>();
for (final Choice choice : choices) {
hashMap.put(choice.getName(), choice);
}
return hashMap;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用Java 8和Guava轻松完成此任务,但我想知道如何在没有Guava的情况下完成此操作.
在番石榴:
private Map<String, Choice> nameMap(List<Choice> choices) {
return Maps.uniqueIndex(choices, new Function<Choice, String>() {
@Override
public String apply(final Choice input) {
return input.getName();
}
});
}
Run Code Online (Sandbox Code Playgroud)
还有Java 8 lambda的番石榴.
private Map<String, Choice> nameMap(List<Choice> choices) {
return Maps.uniqueIndex(choices, Choice::getName);
}
Run Code Online (Sandbox Code Playgroud) 最近,我与一位同事讨论了如何在Java中转换List为最佳方式,Map以及是否有任何特定的好处.
我想知道最佳转换方法,如果有人能指导我,我会非常感激.
这是一个好方法:
List<Object[]> results;
Map<Integer, String> resultsMap = new HashMap<Integer, String>();
for (Object[] o : results) {
resultsMap.put((Integer) o[0], (String) o[1]);
}
Run Code Online (Sandbox Code Playgroud) 当我使用Java 8的新语法糖迭代一个集合时,例如
myStream.forEach(item -> {
// do something useful
});
Run Code Online (Sandbox Code Playgroud)
这不等同于下面的"旧语法"片段吗?
myStream.forEach(new Consumer<Item>() {
@Override
public void accept(Item item) {
// do something useful
}
});
Run Code Online (Sandbox Code Playgroud)
这是否意味着Consumer每次迭代集合时都会在堆上创建一个新的匿名对象?这需要多少堆空间?它有什么性能影响?这是否意味着我在迭代大型多级数据结构时应该使用旧样式for循环?
为什么供应商只支持no-arg构造函数?
如果存在默认构造函数,我可以这样做:
create(Foo::new)
Run Code Online (Sandbox Code Playgroud)
但如果唯一的构造函数采用String,我必须这样做:
create(() -> new Foo("hello"))
Run Code Online (Sandbox Code Playgroud) java lambda functional-programming java-8 functional-interface
为什么我应该使用Function.identity()返回它收到的相同内容而不使用输入做任何事情或以某种方式修改输入?
Apple apple = new Apple(10, "green");
Function<Apple, Apple> identity = Function.identity();
identity.apply(apple);
Run Code Online (Sandbox Code Playgroud)
必须有一些实际用法,我无法弄清楚.
我已经创建了计算字母表中每个字符的方法.我正在学习流(函数式编程)并尝试尽可能多地使用它们,但在这种情况下我不知道该怎么做:
private Map<Character, Integer> numerateAlphabet(List<Character> alphabet) {
Map<Character, Integer> m = new HashMap<>();
for (int i = 0; i < alphabet.size(); i++)
m.put(alphabet.get(i), i);
return m;
}
Run Code Online (Sandbox Code Playgroud)
那么,如何使用Java 8流重写它呢?
这是我正在使用的代码的最小示例:
public class Temp {
enum SomeEnum {}
private static final Map<SomeEnum, String> TEST = new EnumMap<>(
Arrays.stream(SomeEnum.values())
.collect(Collectors.toMap(t -> t, a -> "")));
}
Run Code Online (Sandbox Code Playgroud)
编译器输出是:
Temp.java:27: error: cannot infer type arguments for EnumMap<>
private static final Map<SomeEnum, String> TEST = new EnumMap<>(Arrays.stream(SomeEnum.values())
^
Run Code Online (Sandbox Code Playgroud)
我发现,这可以通过更换被合作周围t -> t有Function.identity()或(SomeEnum t) -> t,但我不理解为什么是这样的情况.javac有什么限制导致这种行为?
我最初在java 8中发现了这个问题,但已经证实它仍然发生在java 11编译器中.
在Java 8 lambdas,Function.identity()或t-> t中找到的答案似乎暗示Function.identity()几乎总是等同于t -> t.然而,在测试用例看出下面,取代t -> t由Function.identity()编译错误的结果.这是为什么?
public class Testcase {
public static <T, A, R, K, V> Collector<T, A, R> comparatorOrdering(
Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends V> valueMapper,
Comparator<? super K> keyComparator,
Comparator<? super V> valueComparator) {
return null;
}
public static void main(String[] args) {
Map<Integer, String> case1 = Stream.of(1, 2, 3).
collect(comparatorOrdering(t -> t, t -> String.valueOf(t),
Comparator.naturalOrder(), Comparator.naturalOrder())); …Run Code Online (Sandbox Code Playgroud) 假设我有这个命令式代码:
List<Function<T, T>> functions = ...
T value = ...
for (Function<T, T> function : functions) {
value = function.apply(value);
}
Run Code Online (Sandbox Code Playgroud)
我如何在功能样式中写这个(就像Scala中的折叠一样)?
转换对象的列表Foo具有id,向Map<Integer,Foo>与该id关键,是容易使用流API:
public class Foo{
private Integer id;
private ....
getters and setters...
}
Map<Integer,Foo> myMap =
fooList.stream().collect(Collectors.toMap(Foo::getId, (foo) -> foo));
Run Code Online (Sandbox Code Playgroud)
有没有办法替换lambda表达式:(foo) -> foo使用::运算符的东西?就像是Foo::this
java ×10
java-8 ×8
lambda ×4
generics ×2
java-stream ×2
hashmap ×1
javac ×1
list ×1
reification ×1