相关疑难解决方法(0)

Java 8将<V>列入Map <K,V>

我想使用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 lambda java-8 java-stream

892
推荐指数
16
解决办法
60万
查看次数

Java:如何将List转换为Map

最近,我与一位同事讨论了如何在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 list hashmap data-conversion data-structures

201
推荐指数
10
解决办法
37万
查看次数

lambda表达式是否在每次执行时都在堆上创建一个对象?

当我使用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循环?

java lambda java-8

166
推荐指数
2
解决办法
3万
查看次数

Java 8 Supplier在构造函数中包含参数

为什么供应商只支持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

63
推荐指数
5
解决办法
7万
查看次数

java.util.function.Function.identity方法的实际用途是什么?

为什么我应该使用Function.identity()返回它收到的相同内容而不使用输入做任何事情或以某种方式修改输入?

Apple apple = new Apple(10, "green");
Function<Apple, Apple> identity = Function.identity();
identity.apply(apple);
Run Code Online (Sandbox Code Playgroud)

必须有一些实际用法,我无法弄清楚.

java java-8

30
推荐指数
2
解决办法
2191
查看次数

如何使用stream - Java 8将List转换为带索引的Map?

我已经创建了计算字母表中每个字符的方法.我正在学习流(函数式编程)并尝试尽可能多地使用它们,但在这种情况下我不知道该怎么做:

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流重写它呢?

java java-8 java-stream

16
推荐指数
4
解决办法
2万
查看次数

为什么这个代码无法编译,引用类型推断作为原因?

这是我正在使用的代码的最小示例:

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 -> tFunction.identity()(SomeEnum t) -> t,但我不理解为什么是这样的情况.javac有什么限制导致这种行为?

我最初在java 8中发现了这个问题,但已经证实它仍然发生在java 11编译器中.

java generics type-inference javac java-8

11
推荐指数
1
解决办法
258
查看次数

为什么Function.identity()会破坏类型依赖,但t - > t不会?

Java 8 lambdas,Function.identity()或t-> t中找到的答案似乎暗示Function.identity()几乎总是等同于t -> t.然而,在测试用例看出下面,取代t -> tFunction.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)

java generics reification

9
推荐指数
1
解决办法
1065
查看次数

如何将函数列表应用于Java 8中的值?

假设我有这个命令式代码:

    List<Function<T, T>> functions = ...
    T value = ...
    for (Function<T, T> function : functions) {
        value = function.apply(value);
    }
Run Code Online (Sandbox Code Playgroud)

我如何在功能样式中写这个(就像Scala中的折叠一样)?

java java-8

9
推荐指数
1
解决办法
2579
查看次数

如何使用:: operator作为此引用

转换对象的列表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 lambda java-8 method-reference

9
推荐指数
2
解决办法
576
查看次数