我是java中函数式编程的新手,并且想知道如何在(例如)此操作中编写代码来避免NPE:
myList.stream()
.reduce((prev, curr) -> prev.getTimestamp().isAfter(curr.getTimestamp()) ? prev : curr);
.get().getTimestamp();
Run Code Online (Sandbox Code Playgroud)
我的目的是找到列表中最新对象的时间戳.关于如何更好地收集最后一个元素的建议非常受欢迎,但我的主要问题实际上是为什么这个有效.
文档说该函数抛出NullPointerException"如果减少的结果为空":
这没关系,但是我不太明白为什么NullPointerException当这个代码运行时只包含一个元素的列表时我没有得到.prev在这种情况下,我预计会为空.我试过调试,但是当只有一个元素时,它似乎只是跨过整个lambda表达式.
我正在构建一个用于离线播放一些音频文件的网络应用程序。我已经阅读并测试了Service Worker API的缓存部分,我可以轻松地将所有音频文件添加到命名缓存中。但是,当我<audio src='/audio/file.mp3'>向 DOM 和play()它添加 a 时,浏览器似乎没有使用它,即使该确切的 URL 已添加到缓存中。
在某种程度上,不自动使用缓存是有道理的,因为这样命名缓存就没有任何意义。
我正在使用 create-react-app,由于我没有弹出,我没有控制 Service Worker。不过,据我所知,无论如何都不建议预先缓存较大的文件,因此我在 UI 中创建了一个函数,让用户决定何时缓存所有文件。
我的问题是:如何将缓存的音频文件放入音频元素?
编辑:我认为这个问题应该可以从我的问题中理解,但是被要求添加代码,所以这是我尝试过的。
该标记有一个音频元素和两个按钮。第一个按钮将 mp3 url 加载到缓存中,第二个按钮尝试两种不同的方式将其设置为音频元素的源:
当然,它们都不起作用,这就是我写这篇文章的原因。:)
<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) 在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组合器)来完成,但到目前为止我还没有成功.如果有人可以为此提供一些示例代码,我相信它也会受到许多其他人的赞赏.
java-8 ×2
audio ×1
cacheapi ×1
caching ×1
collections ×1
html ×1
java ×1
java-stream ×1
javascript ×1
null ×1
reduce ×1