如何移除ContentInfoCompat onReceiveContent()中的Lambda表达式
替换Lambda表达式为非Lambda形式的实现方案
当然可以实现,Lambda本质是Java函数式接口的语法糖,你只需要用匿名内部类实现对应的函数式接口即可。
这里contentInfo.partition()方法接收的是Predicate<ContentInfoCompat.Item>类型的参数,我们可以直接创建这个接口的匿名实现类,替代原来的Lambda表达式:
修改后的完整代码如下:
public class MyReceiver implements OnReceiveContentListener { public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"}; @Override public ContentInfoCompat onReceiveContent(View view, ContentInfoCompat contentInfo) { Pair<ContentInfoCompat, ContentInfoCompat> split = contentInfo.partition( new Predicate<ContentInfoCompat.Item>() { @Override public boolean test(ContentInfoCompat.Item item) { return item.getUri() != null; } }); ContentInfoCompat uriContent = split.first; ContentInfoCompat remaining = split.second; if (uriContent != null) { // 应用特定逻辑,处理uriContent中的URI... } // 返回应用未处理的内容,保留平台默认行为 return remaining; } }
补充说明
- 原来的Lambda表达式
item -> item.getUri() != null,和匿名内部类中test方法的逻辑完全等价,都是判断每个ContentInfoCompat.Item的Uri是否不为空 - 底层逻辑确实是循环处理
contentInfo中的所有Item,和你对这部分逻辑的判断一致
内容的提问来源于stack exchange,提问作者Patryk F
相关产品推荐
相关产品推荐

