小编awe*_*ell的帖子

仅使用一个元素在列表上调用stream().reduce()

我是java中函数式编程的新手,并且想知道如何在(例如)此操作中编写代码来避免NPE:

myList.stream()
      .reduce((prev, curr) -> prev.getTimestamp().isAfter(curr.getTimestamp()) ? prev : curr);
      .get().getTimestamp();
Run Code Online (Sandbox Code Playgroud)

我的目的是找到列表中最新对象的时间戳.关于如何更好地收集最后一个元素的建议非常受欢迎,但我的主要问题实际上是为什么这个有效.

文档说该函数抛出NullPointerException"如果减少的结果为空":

http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-java.util.function.BinaryOperator-

这没关系,但是我不太明白为什么NullPointerException当这个代码运行时只包含一个元素的列表时我没有得到.prev在这种情况下,我预计会为空.我试过调试,但是当只有一个元素时,它似乎只是跨过整个lambda表达式.

java collections null functional-programming java-8

13
推荐指数
2
解决办法
7381
查看次数

来自缓存的 HTML 音频元素源

我正在构建一个用于离线播放一些音频文件的网络应用程序。我已经阅读并测试了Service Worker API的缓存部分,我可以轻松地将所有音频文件添加到命名缓存中。但是,当我<audio src='/audio/file.mp3'>向 DOM 和play()它添加 a 时,浏览器似乎没有使用它,即使该确切的 URL 已添加到缓存中。

在某种程度上,不自动使用缓存是有道理的,因为这样命名缓存就没有任何意义。

我正在使用 create-react-app,由于我没有弹出,我没有控制 Service Worker。不过,据我所知,无论如何都不建议预先缓存较大的文件,因此我在 UI 中创建了一个函数,让用户决定何时缓存所有文件。

我的问题是:如何将缓存的音频文件放入音频元素?

编辑:我认为这个问题应该可以从我的问题中理解,但是被要求添加代码,所以这是我尝试过的。

该标记有一个音频元素和两个按钮。第一个按钮将 mp3 url 加载到缓存中,第二个按钮尝试两种不同的方式将其设置为音频元素的源:

  1. 从缓存的响应中插入 blob
  2. 将缓存的请求 url 设置为音频 src

当然,它们都不起作用,这就是我写这篇文章的原因。:)

<div>
    <audio src="/audio/shape_of_you.mp3" controls/>
</div>
<div>
    <button onclick="addToCache()">Add to cache</button>
    <button onclick="playCachedAudio()">Play cached audio</button>
</div>


<script>
    function addToCache() {
        caches.open('myCache').then((cache) => {
            cache.add('/audio/rise.mp3').then(() => {
                console.log('cached');
            });
        });
    }

    function playCachedAudio() {
        caches.open('myCache').then((cache) => {
            cache.match('/audio/rise.mp3').then((cachedAudio) => {
                cachedAudio.blob().then(cont => {
                    let audioEl …
Run Code Online (Sandbox Code Playgroud)

html javascript audio caching cacheapi

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

Java8:减少像sql group by这样的元素列表

stream().filter().map()列表上有一个类似的数据结构,List<List<Object>>如下所示:

[["1","a",20],
 ["1","b",10],
 ["2","a",10],
 ["2","b",30]]
Run Code Online (Sandbox Code Playgroud)

我想要的是按内部列表的第一个元素的值进行分组,保留中间元素,最后将每个"组"的最后元素相加.

[["1", 30],
 ["2", 40]]
Run Code Online (Sandbox Code Playgroud)

对不起,如果这对你们中的一些人来说很明显,但我还没有找到如何实现这一目标的任何例子.我假设它可以通过Stream.reduce(U身份,BiFunction累加器,BinaryOperator组合器)来完成,但到目前为止我还没有成功.如果有人可以为此提供一些示例代码,我相信它也会受到许多其他人的赞赏.

reduce functional-programming java-8 java-stream

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