从Java 8开始,Java不提供Tail-Call Optimization(TCO).在研究它时,我开始知道原因是:
在jdk类中,有许多安全敏感方法依赖于计算jdk库代码和调用代码之间的堆栈帧来确定谁在调用它们.
但是,基于JVM的Scala支持Tail-Call Optimization.Scala在编译时进行尾递归优化.为什么Java不能使用相同的方法?
PS:不确定Java的最新版本(现在的Java 11)现在是否具有TCO.如果有些知道的人也能分享这个,那就太好了.
注意
我知道TCO处于积压状态并且优先级较低,但是想知道为什么Java在编译时不能像Scala那样进行更改.
由于大多数命令式语言都没有Java,因此Java没有尾调用优化.命令式循环是该语言的首选样式,程序员可以用命令式循环替换尾递归.(来源)
我在网上搜索了各种文章和 Stack Overflow 问题,但我找不到完美的答案。有许多问题与此接近,但略有不同。
我们知道 Java 8 Streams API 在内部使用 Fork-Join Pool。
现在我的问题是如何使用 Fork-Join 池划分流管道中的任务?
假设我们有以下内容:
List myList = inputList.parallelStream().filter( x -> x>0 )
.map(x -> x+100 ).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
现在我们有两种使用线程池划分任务的选项。
filter和map作为单个任务并使用 fork-join 池运行它。filter和map作为两个不同的任务,并使用两个不同的 fork-join 线程池运行它们。我也知道流是延迟传播的,所以如果我们 在两者之间有一个 有状态的中间操作:
List myList2 = inputList.parallelStream().filter( x -> x>0 )
.map(x -> x+5 ).sorted().map(x -> x+5 ).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
那么如何创建线程池呢?
PS:之前就知道map功能是可以组合的。我只是想为这个问题举个例子。
有人能说出HazelCast的多播发现是如何运作的.我想要每个成员的细节发现它的同行.我一直试图找到一些好的资源,但没有找到任何详细的解释.
当我尝试执行以下操作时(01434.210 instead of 1434.210)
$val=22749.220-(21315.010+01434.210)
print $val
Run Code Online (Sandbox Code Playgroud)
我得到这些输出
output 638.207900000001
Run Code Online (Sandbox Code Playgroud)
但根据我的输出必须0.
我错过了什么?
我在 JAVA 中遇到微服务问题。我不明白为什么我的代码不想编译。
我按照教程、视频(法语)创建一个简单的项目来熟悉微服务。
我创建了一个控制器、dao 和一个模型。当我编译控制器以访问 127.0.0.1.1port/Produits 时,它必须返回我在代码中定义的产品列表,但在编译时它显示我曾经有一只手:
“错误:在类中找不到方法main
“虽然正常启动项目我不需要手,因为它必须只是告诉我“好的,你可以去127.0.0.1/端口”(端口是在应用程序中定义的。属性并没有被占用)
这是我的项目的架构:
这是我要编译的控制器代码:
package com.ecommerce.microcommerce.controller;
import com.ecommerce.microcommerce.dao.ProductDao;
import com.ecommerce.microcommerce.model.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class ProductController {
@Autowired
private ProductDao productDao;
//Produits
@GetMapping(value = "Produits")
public List<Product> listeProduits() {
return productDao.finAll();
}
//Produits/{id}
@GetMapping(value = "Produits/{id}")
public Product afficherUnProduit(@PathVariable int id) {
Product product = new Product(1, new String("aspirateur"), 100);
return product;
}
}
Run Code Online (Sandbox Code Playgroud)
我的 DAO 中的文件:
package com.ecommerce.microcommerce.dao;
import com.ecommerce.microcommerce.model.Product;
import java.util.List; …Run Code Online (Sandbox Code Playgroud) 如何在cpp中创建不可变列表?列表的引用及其数据应保持不变。
我不会在vector或任何其他容器上做包装器类(我知道与本文类似的方法)。
使用constexpr或进行此操作的最佳方法是什么const pointers?
session_start();
$username = $_SESSION['username'];
$db = new PDO("mysql:host=".DBHOST.";charset=utf8mb4;dbname=".DBNAME,
DBUSER, DBPASS);
function keygrabber($username) { //You need to pass a variable into this
function
global $db; //Gain access to the $db variable, which is out of scope due to
being inside of a function
$stmt = $db->prepare("SELECT * FROM keys WHERE username='$username'");
//Prepare the query
$stmt->execute(); //Execute the query
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); //Fetch the query results
var_dump($results); //Dump the results
}
keygrabber($username);
Run Code Online (Sandbox Code Playgroud)
因此,如果我更改username='$username';为username='myactualusername';,它会起作用,即它不会显示任何错误或任何内容。
我基本上试图从与用户用户名匹配的键中获取所有数据。将来我会将其更改为 userID,但现在变量不起作用,因此我无法继续。
谢谢您的帮助
java ×4
compilation ×2
c++ ×1
hazelcast ×1
immutability ×1
java-8 ×1
java-stream ×1
jvm ×1
perl ×1
php ×1
recursion ×1