标签: java-8

mapToDouble()是否真的需要将List <Double>与Java 8流相加?

据我所知,List<Double>使用Java 8流总结的方法是这样的:

List<Double> vals = . . . ;
double sum = vals.stream().mapToDouble(Double::doubleValue).sum();
Run Code Online (Sandbox Code Playgroud)

对我来说,这mapToDouble(Double::doubleValue)似乎是一种狡猾 - 只是那种lambdas和溪流应该免除的样板"仪式".

最佳实践告诉我们更喜欢List实例而不是数组,但是对于这种求和,数组似乎更清晰:

double[] vals = . . . ;
double sum = Arrays.stream(vals).sum();
Run Code Online (Sandbox Code Playgroud)

当然,人们可以这样做:

List<Double> vals = . . . ;
double sum = vals.stream().reduce(0.0, (i,j) -> i+j);
Run Code Online (Sandbox Code Playgroud)

但那reduce(....)比这长得多sum().

我知道这与流需要围绕Java的非对象原语进行改造的方式有关,但是,我在这里遗漏了一些东西吗?有没有办法挤压自动装箱以缩短它?或者这仅仅是当前最先进的技术?


更新 - 答案摘要

以下是答案的摘要.虽然我在这里有一个摘要,但我敦促读者自己仔细阅读答案.

@dasblinkenlight解释说,由于Java历史上的进一步决策,特别是在实现泛型的方式以及它们与非对象原语的关系中,因此总是需要某种拆箱.他指出,理论上编译器可以直接进行拆箱并允许使用简短的代码,但这还没有实现.

@Holger展示了一个非常接近我所询问的表现力的解决方案:

double sum = vals.stream().reduce(0.0, Double::sum);
Run Code Online (Sandbox Code Playgroud)

我不知道新的静态Double.sum()方法.添加1.8,似乎是出于我描述的目的.我也发现了Double.min()Double.max().展望未来,我肯定会使用这个成语来进行类似的操作List<Double>.

java java-8 java-stream

65
推荐指数
3
解决办法
4万
查看次数

将List拆分为沿元素的子列表

我有这个清单(List<String>):

["a", "b", null, "c", null, "d", "e"]
Run Code Online (Sandbox Code Playgroud)

我想要这样的事情:

[["a", "b"], ["c"], ["d", "e"]]
Run Code Online (Sandbox Code Playgroud)

换句话说,我想使用null值作为分隔符将我的列表拆分为子列表,以获取列表列表(List<List<String>>).我在寻找Java 8解决方案.我尝试过,Collectors.partitioningBy但我不确定这是我在寻找什么.谢谢!

java list java-8 collectors

65
推荐指数
5
解决办法
3万
查看次数

如果不存在,如何在Optional上执行逻辑?

我想用java8替换下面的代码Optional:

public Obj getObjectFromDB() {
    Obj obj = dao.find();
    if (obj != null) {
        obj.setAvailable(true);
    } else {
        logger.fatal("Object not available");
    }

    return obj;
}
Run Code Online (Sandbox Code Playgroud)

以下伪代码不起作用,因为没有orElseRun方法,但无论如何它说明了我的目的:

public Optional<Obj> getObjectFromDB() {
    Optional<Obj> obj = dao.find();
    return obj.ifPresent(obj.setAvailable(true)).orElseRun(logger.fatal("Object not available"));
}
Run Code Online (Sandbox Code Playgroud)

java optional java-8

65
推荐指数
8
解决办法
9万
查看次数

"为何选择Apache Harmony"或"如何在Android上使用Java 8"

我们大多数人现在已经听说过Java 8将带来的酷炫功能,但Android不会支持它.这是因为Google使用Apache Harmony for Android.这就是让我们(Android应用程序开发人员)改进我们的代码与lambdas,接口中的默认实现,切换字符串等等.当然,我们会处理一段时间,但如果我们在应用程序中使用的某些库开始使用Java 8功能呢?据我所知,这不起作用(如果错误,请纠正我).这会在Standard -Java和Android -Java 之间产生不兼容性.它不可能是谷歌的意图,或者至少我不能想到一个公司,开发一个广泛采用的操作系统,不会永远留在旧的 Java版本的原因.

问题:

  • 他们为什么使用Apache Harmony?
  • 为什么他们不能采用更新版本的java?
  • 如果他们不想要Oracle的Java,为什么他们不能使用OpenJDK的子集(这里的许可noob)?
  • 您是否知道有任何更新已用Java版本的计划?
  • 您知道在当前Android系统上使用Java 8类的任何方法吗?

java apache android java-8

64
推荐指数
3
解决办法
1万
查看次数

Java 8中的抽象类和接口有什么区别?

在Java中,抽象类和接口之间曾经存在微妙但重要的区别:默认实现.抽象类可以拥有它们,接口却不能.Java 8虽然引入了接口的默认实现,但这意味着这不再是接口和抽象类之间的关键区别.

那是什么?

尽我所知,唯一剩下的差异(除了可能是引擎效率之外的东西)是抽象类遵循传统的Java单继承,而接口可以有多重继承(或者如果你愿意,可以有多个实现).这引出了另一个问题 -

新的Java 8接口如何避免钻石问题

java abstract-class interface diamond-problem java-8

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

将两个Map <String,Integer>与Java 8 Stream API合并

我有两个(或更多)Map<String, Integer>对象.我想将它们与Java 8 Stream API合并,使公共键的值应该是值的最大值.

@Test
public void test14() throws Exception {
    Map<String, Integer> m1 = ImmutableMap.of("a", 2, "b", 3);
    Map<String, Integer> m2 = ImmutableMap.of("a", 3, "c", 4);
    List<Map<String, Integer>> list = newArrayList(m1, m2);

    Map<String, Integer> mx = list.stream()... // TODO

    Map<String, Integer> expected = ImmutableMap.of("a", 3, "b", 3, "c", 4);
    assertEquals(expected, mx);
}
Run Code Online (Sandbox Code Playgroud)

如何将此测试方法设为绿色?

我已经打了collect,并Collectors有一阵子没有任何成功.

(ImmutableMapnewArrayList来自谷歌番石榴).

java merge java-8 java-stream

64
推荐指数
4
解决办法
6万
查看次数

为什么使用invokedynamic调用Java 8 lambdas?

invokedynamic指令用于帮助VM在运行时确定方法引用,而不是在编译时对其进行硬连线.

这对于动态语言很有用,其中确切的方法和参数类型在运行时才知道.但Java lambda不是这种情况.它们被转换为具有明确定义的参数的静态方法.并且可以使用此方法调用此方法invokestatic.

那么invokedynamiclambda 的需求是什么,尤其是在性能受到影响的情况下?

java lambda jvm bytecode java-8

64
推荐指数
3
解决办法
1万
查看次数

Java 8 Collectors.toMap SortedMap

我正在使用Java 8 lambdas并希望Collectors toMap用来返回一个SortedMap.我能想出的最好的是调用下面Collectors toMap用假设法mergeFunctionmapSupplier等于TreeMap::new.

public static <T, K, U, M extends Map<K, U>>
        Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                Function<? super T, ? extends U> valueMapper,
                BinaryOperator<U> mergeFunction,
                Supplier<M> mapSupplier) {
    BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element),
            valueMapper.apply(element), mergeFunction);
    return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}
Run Code Online (Sandbox Code Playgroud)

我不想传递合并函数,正如我想要throwingMerger()的那样,与基本toMap实现相同,如下所示:

public static <T, K, U>
        Collector<T, ?, Map<K, U>> toMap(Function<? …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream collectors

64
推荐指数
5
解决办法
3万
查看次数

'Optional.get()'没有'isPresent()'检查

我在Java中有以下搜索代码:

return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get();
Run Code Online (Sandbox Code Playgroud)

我希望按名称找到列并返回第一个找到的列.

我知道有一个案例,什么都没找到,应该处理,但如何?

这就是它所要的咒骂:

'Optional.get()' without 'isPresent()' check
Run Code Online (Sandbox Code Playgroud)

怎么修?null如果没有找到,我希望回来.

UPDATE

好吧,好吧,我只是没有意识到,那会findFirst()回来Optional.

java optional java-8 java-stream

64
推荐指数
4
解决办法
6万
查看次数

Lambda这个引用在java中

我想把一个转换anonymous class成一个lambda expression.但这个匿名类我使用this关键字.

例如,我写了这个简单的Observer/Observable模式:

import java.util.ArrayList;
import java.util.Collection;

public static class Observable {
    private final Collection<Observer> notifiables = new ArrayList<>();

    public Observable() { }

    public void addObserver(Observer notifiable) { notifiables.add(notifiable); }
    public void removeObserver(Observer notifiable) { notifiables.add(notifiable); }

    public void change() {
        notifiables.forEach(notifiable -> notifiable.changed(this));
    }
}

public interface Observer {
    void changed(Observable notifier);
}
Run Code Online (Sandbox Code Playgroud)

这个带有匿名类的示例代码(使用this关键字):

public class Main {

    public static void main(String[] args) {
        Observable observable = new Observable();
        observable.addObserver(new …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

63
推荐指数
1
解决办法
2万
查看次数