Java 中 lambda 的返回值

2024-01-01

到目前为止,我设法找到了我需要的所有答案,但这个让我感到困惑。假设我们有示例代码:

public class Animal {
   private String species;
   private boolean canHop;
   private boolean canSwim;
   public Animal(String speciesName, boolean hopper, boolean swimmer) {
     species = speciesName;
     canHop = hopper;
     canSwim = swimmer;
   }
  public boolean canHop() { return canHop; }
  public boolean canSwim() { return canSwim; }
  public String toString() { return species; }
}

public interface CheckAnimal {
   public boolean test(Animal a);
}

public class FindSameAnimals {
   private static void print(Animal animal, CheckAnimal trait) {
      if(trait.test(animal)){
         System.out.println(animal);
      }

   public static void main(String[] args) {
      print(new Animal("fish", false, true), a -> a.canHop());
   }
}

OCA学习指南(考试1Z0-808)书中说这两行是等效的:

a -> a.canHop()
(Animal a) -> { return a.canHop(); }

这是否意味着,Java 在幕后添加了关键字return在第一种情况下编码?

如果答案是“是”,那么接下来的代码如何编译(想象其他所有内容都在正确的位置):

static int counter = 0;
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(() -> counter++));

如果我们知道签名execute和可运行的run are:

void execute(Runnable command)
void run()

如果答案是否定的,那么 Java 如何知道何时需要返回某些内容,何时不需要返回某些内容?也许在

a -> a.canHop()

我们想忽略的情况boolean方法的返回类型。


这是否意味着,在幕后,Java 在第一种情况下将关键字 return 添加到代码中?

不,编译器生成字节码,它可能会生成相同的字节码,但不会更改语法,然后再次编译。

我们想忽略方法的布尔返回类型。

它可以选择根据正在考虑的功能接口忽略某个值。

a -> a.canHop()

could be

(Animal a) -> { return a.canHop(); }

or

(Animal a) -> { a.canHop(); }

基于上下文,但如果可能的话,它倾向于第一个。

考虑ExecutorService.submit(Callable<T>) and ExecutorService.submit(Runnable)

ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(() -> counter++); // has to be Runnable
es.submit(() -> counter++); // Callable<Integer> or Runnable?

保存返回类型,您可以看到它是Callable<Integer>

final Future<Integer> submit = es.submit(() -> counter++);

为了自己尝试一下,这里有一个更长的例子。

static int counter = 0;

public static void main(String[] args) throws ExecutionException, InterruptedException {
    ExecutorService es = Executors.newSingleThreadExecutor();

    // execute only takes Runnable
    es.execute(() -> counter++);

    // force the lambda to be Runnable
    final Future<?> submit = es.submit((Runnable) () -> counter++);
    System.out.println(submit.get());

    // returns a value so it's a Callable<Integer>
    final Future<Integer> submit2 = es.submit(() -> counter++);
    System.out.println(submit2.get());

    // returns nothing so it must be Runnable
    final Future<?> submit3 = es.submit(() -> System.out.println("counter: " + counter));
    System.out.println(submit3.get());

    es.shutdown();
}

prints

null
2
counter: 3
null

首先submit take a Runnable so Future.get()回报null

第二submit默认为Callable so Future.get()回报2

第三submit只能是一个void返回值,因此它必须是Runnable so Future.get()回报null

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中 lambda 的返回值 的相关文章

  • SWIG 类型映射 uint8_t* 从 C/C++ 到 java.nio.ByteBuffer

    我正在尝试将输入和输出缓冲区从 C 传递给 java 类 出于效率原因 我需要使用 ByteBuffer 这两个缓冲区都是在 C 部分中分配的 我需要将它们传递给一个 java 函数 该函数将使用输入缓冲区进行一些计算并将结果写入输出缓冲区
  • Java简单加密

    我想加密存储在磁盘上的文本 配置 文件 尝试使用DES http en wikipedia org wiki Data Encryption Standard加密 我在客户端计算机上遇到了致命错误 后来我发现该算法无法处理重音字符 我怀疑这
  • TestNG 启动期间发生内部错误

    我创建了一个 TestNG 类 FirstTest java 当我将测试用例作为 TestNG Test 运行时 出现以下错误 期间发生内部错误 启动 FirstTest java lang NullPointerException Ecl
  • 如何在 Android 中恢复我的音频?

    我必须实现用于创建具有暂停和恢复状态的音频的应用程序 当我的应用程序作为启动时音频启动 当我按下模拟器上的后退按钮时 音频音乐处于暂停状态 但是当我的活动回来时从停止状态到前台我的音频音乐未恢复 这是我的代码 public class Au
  • 通过 JDBC 与 CLI 使用 MIT Kerberos 连接到 PostgreSQL 9.4 时出错

    我已经使用 MIT Kerberos 5 设置了 PostgreSQL 9 4 并且可以使用 psql 在 CLI 上连接 提交指纹后 我的委托人是 bgiles postgres REALM pg hba conf 有 host all
  • SimpleDateFormat 无法正确处理 DD

    我正在尝试获得这样的格式 2013 06 15 17 45 我在代码中执行以下操作 Date d new Date SimpleDateFormat ft new SimpleDateFormat YYYY MM DD HH mm Stri
  • ORMLite - join where 子句中的括号

    我想使用连接三个表QueryBuilder join and QueryBuilder joinor但我想在 where 子句中添加括号 如下所示 WHERE first table where AND second table where
  • JavaFX 动画使用循环?

    我正在尝试制作一款类似太空侵略者的游戏 我画了一个正方形 我想通过使用循环逐步向下移动它thread sleep 然而 正方形立即被绘制出来 我知道有可以使用的动画路径 但我想保持低水平并仅使用坐标系 有没有办法使用这样的循环来制作时间轴动
  • Java中的运算符重载和覆盖

    运算符重载和运算符重写有什么区别 它们在继承和控制台程序中是否相同 Java 不支持运算符重载和重写 检查以下引用自的描述 http java sun com docs white langenv Simple doc2 html http
  • EasyMock : java.lang.IllegalStateException: 1 个匹配器预期,2 个记录

    我在使用 EasyMock 2 5 2 和 JUnit 4 8 2 通过 Eclipse 运行 时遇到问题 我已阅读此处所有类似的帖子 但尚未找到答案 我有一个包含两个测试的类 它们测试相同的方法 我正在使用匹配器 每个测试单独运行时都会通
  • 如何在开头时解析 json 文件

    我想解析以下 JSON 文件 但以 向我表明这是一个数组 然后继续 对象 我当前的解析器返回一个 JSON 对象 我的问题是 如何修改解析器来解析这个文件 这样解析器将为我提供其他 JSON 文件 从对象或排列开始 JSON 文件 codi
  • 为什么 Casbah / Java MongoDB 驱动程序最终会出现 java.lang.IllegalArgumentException?

    我使用时看到一个奇怪的问题casbah java driver 当驱动程序尝试从 mongo 创建响应时 我不断遇到以下异常 Oct 16 2012 10 45 07 AM com mongodb DBTCPConnector MyPort
  • 无法从 ViewPager 中的 Fragment 编辑 ActionBar 标题

    我有一个Activity它通过一个托管多个片段ViewPager 在活动的onCreate方法我使用以下代码来更改ActionBar title Toolbar toolbar findViewById R id toolbar setSu
  • 为什么 Cassandra 客户端在生产中没有 epoll 时会失败? [复制]

    这个问题在这里已经有答案了 当我在本地运行服务时 我收到一条警告 指出 epoll 不可用 因此它使用 NIO 很公平 当我将其部署到 Kubernetes 中时 我得到了以下信息 这导致服务无法运行 2017 03 29T19 09 22
  • 飞碟 - html 实体未呈现

    我正在使用 Flying saucer lib 生成 pdf 但我对一些 html 实体有问题 我已经在寻找解决方案 我在这个论坛和其他地方找到了很多提示 但仍然存在问题 我尝试过这种方法 http sdtidbits blogspot c
  • SecurityContextHolder.getContext().getAuthentication() 返回 null

    我想使用以下代码手动绕过 spring Security 的用户 User localeUser new User UsernamePasswordAuthenticationToken auth new UsernamePasswordA
  • 使用 OpenNLP 获取句子的解析树。陷入困境。

    OpenNLP 是一个关于自然语言处理的 Apache 项目 NLP 程序的目标之一是解析一个句子 并给出其语法结构的树 例如 天空是蓝色的 这句话 可能会被解析为 S NP VP The sky is blue where S是句子 NP
  • 用什么? MVC、MVP 或 MVVM 还是……?

    我将启动一个 Java 项目来开发桌面应用程序 使用什么作为表示层模式 MVC MVP MVVM 或 如果可能的话 举一些可行的小例子 Actually the ultimate post you re looking for is thi
  • 丰富:数据表行跨度问题

    我需要创建一个 rich dataTable 甚至扩展 具有以下功能 我有一个公司类 其中包含产品对象的集合 我想展示下表 我仍然没有弄清楚如何使用子表执行此操作 在所有示例中 我发现子表具有与主表完全相同的列 据推测 我需要在前两列中使用
  • 如何获取 res.drawable 文件夹的路径来复制文件?

    我正在编写我的应用程序AndroidStudio 我的里面有gif文件drawable gifs文件夹 我希望将该文件复制到MediaStore Images Media单击按钮后的文件夹 目前 即使使用发布的一些答案 我也无法获取我的 g

随机推荐

  • 数据库项目在部署之前删除数据库?

    是否可以让 VS 在部署之前删除目标数据库 我尝试向项目添加部署后脚本 但它总是以活动连接的形式返回 你需要查找Always recreate database数据库项目属性中的选项 gt 部署 gt 部署配置文件 gt 编辑对话框 另一个
  • 无法使用 PHPunit Selenium 执行 javascript

    我正在尝试使用 PHPUnit 命令执行 JavaScript 代码 它执行 PHP 代码并发送电子邮件和其他内容 但是该 php 文件中有一些 javascript 代码 可以将一些数据发送到第三方 url 这似乎不起作用 关于如何执行
  • iPhone 连接测试:如何强制其断开连接?

    如果我找不到互联网连接 Apple 希望我向用户友好道歉 使用可达性演示 这很容易 我想更进一步并监视连接丢失 该演示具有此功能 但我不知道如何关闭连接来测试它是否有效 我将如何模拟连接丢失 或实际丢失 如果您在 iPhone Simula
  • Windows 8.1 Metro 应用程序 - 捏合和缩放图像

    有没有办法在 Windows 8 1 中的 XAML 中实现捏合和缩放图像控件 我正在尝试操作增量事件 但该事件没有被触发 我也尝试设置 ManipulationMode All
  • 从 ajax 调用 WebApi 时如何调试 500 内部服务器错误?

    我在 MVC 4 5 WebApi 项目中收到 500 内部服务器错误 我可以使用 GET 和带有 Id 的 GET 成功调用我的 Web 服务 但是 当我发布文件时 我收到错误 我可以设置一个断点Application BeginRequ
  • 从 python 编译 Latex

    我制作了一些 python 函数来将传递的字符串编译为pdf使用乳胶文件 该功能按预期工作并且非常有用 因此我寻找改进它的方法 我有的代码 def generate pdf pdfname table Generates the pdf f
  • Jmeter-NonGUIDriver java.lang.IllegalArgumentException 中出现错误

    尝试使用 Maven 项目执行 jmx Jmeter 在Jmeter 3 1版本中创建了jmx文件 使用 jmeter maven plugin 2 1 0 使用 mvn clean verify 在命令行中执行时出现以下错误 INFO P
  • NSURLIsExcludedFromBackupKey 无法正确设置

    我试图阻止 iTunes 备份整个文件夹 我关注了技术报告http developer apple com library ios qa qa1719 index html http developer apple com library
  • Ansible 如何根据某些属性选择主机并使用它们的 IP 地址在运行时创建列表

    我有一个关于 ansible 中数据操作的具体问题 在我的清单文件中 我有一个名为 postgresql 的组 如下所示 postgresql host1 ansible host 1 1 1 1 postgresql cluster po
  • iOS应用程序包含开发者路径信息

    检查存档的应用程序 我可以看到应用程序二进制文件中列出的一些源代码文件的完整路径 并未列出所有源代码文件 strings the binary app grep m reveals Users bbarnhart myPath myPath
  • Spring Boot REST 应用程序应该接受并生成 XML 和 JSON

    我正在研究 Spring Boot REST API 我的应用程序应该使用并生成 XML 和 JSON 我遇到了 Jackson json Xml 依赖项
  • 如何在 CSS 中选择具有特定类名的“最后一个子级”? [复制]

    这个问题在这里已经有答案了 ul li class list test1 li li class list test2 li li class list test3 li li test4 li ul 如何选择具有班级名称的 最后一个孩子
  • 避免“fetch()”将模型属性标记为已更改

    我在用户设置配置文件表单中使用 Backbone 我获取模型并将其信息呈现到表单中 当我保存模型时all发送参数而不是用户更改的参数 首先 我获取模式并将其渲染在视图上 Fetch model and render on view user
  • 选择最近的记录

    如果记录具有几乎相同类型的数据 如何选择最新记录 example col1 col2 col3 col4 123 abc 1 1 12345 123 abc 1 1 123445 1234 dsv 2 0 123 1234 dsv 2 0
  • 当a和b都小于c,但a * b溢出时,如何计算a * b / c?

    假如说uint是我的定点平台上最大的整数类型 我有 uint func uint a uint b uint c 需要返回一个很好的近似值a b c 的价值c大于两者的值a和价值b 所以我们肯定知道a b c适合一个uint 然而 价值a
  • Rails 4 更新时嵌套属性多条记录

    我被困住了 我不知道为什么它不能正常工作 我有一个模型产品 有很多标签 当我更新产品轨道时 会正确更新产品属性 但会创建另一个标签记录 而不仅仅是更新它 这是我的代码 查看表格 div class field br div div clas
  • 在浏览器中内联打开 CSV 文件而不是提示 DL

    所以我有一个 php 文件 它使用 fopen fputcsv fclose 创建一个 csv 文件 以及一个导出按钮的 javascript 函数 该按钮指示窗口打开所述 csv 文件 csv 文件已正确创建 但当我点击导出按钮时 它只会
  • 谷歌图表不显示

    我正在尝试使用聚合物组件 但它没有显示 该元素就在那里 我可以在检查器中看到它 但它只是不显示 也没有任何没有帮助的错误消息 我尝试在聚合物文档中重新创建 demo html 但再次没有显示任何内容 goole chart 元素有问题吗
  • 单个 malloc 中的多个结构调用未定义的行为?

    From 声明灵活数组成员时使用正确的语法 https wiki sei cmu edu confluence display c DCL38 C Use the correct syntax when declaring a flexib
  • Java 中 lambda 的返回值

    到目前为止 我设法找到了我需要的所有答案 但这个让我感到困惑 假设我们有示例代码 public class Animal private String species private boolean canHop private boole