给定一个具有属性的项目列表,我试图让最后一个项目显示所述属性的最大值.
例如,对于以下对象列表:
t i
A: 3
D: 7 *
F: 4
C: 5
X: 7 *
M: 6
Run Code Online (Sandbox Code Playgroud)
我可以得到最高的东西之一i:
Thing t = items.stream()
.max(Comparator.comparingLong(Thing::getI))
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
但是,这会得到我Thing t = D.是否有一种干净而优雅的方式来获取最后一项,即X在这种情况下?
一种可能的解决方案是使用该reduce功能.但是,该属性是动态计算的,它看起来更像是:
Thing t = items.stream()
.reduce((left, right) -> {
long leftValue = valueFunction.apply(left);
long rightValue = valueFunction.apply(right);
return leftValue > rightValue ? left : right;
})
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
在valueFunction现在需要将近一倍,而调用.
其他明显的迂回解决方案是:
我在理解reducer和中间件之间的应用程序差异时遇到了一些麻烦.许多网站描述了中间件甚至给出了精确的定义:
它在调度操作和到达reducer之间提供了第三方扩展点.
要么:
中间件是通过组合功能来创建的,这些功能包含了不属于主要执行任务的单独的横切关注点.
但是,从这些我都明白的是,有是有差别,只是没有什么.根据我的判断,不同之处在于,一个人采取行动并将该行动传递给另一个人,另一个采取行动和状态,并"通过国家".但您仍然可以访问midddleware中的商店.因此,存储和操作都要经过中间件,然后是减速器.因此减速器可以执行日志记录.
虽然日志记录似乎是中间件的一个显而易见的应用程序,但有更多含糊不清的例子.例如,将一些简单的身份验证写入模块,您可以使用中间件函数来执行用户发送的操作并确定其身份验证级别:
import { getAuthLevel } from './auth';
export default store => next => action => {
return next({...action, auth: getAuthLevel(action.clientId)});
}
Run Code Online (Sandbox Code Playgroud)
你可能有很多像这样的用户:
{
users: [{
clientId: 'bobsUnqiueClientId',
user: 'Bob',
password: 'ilikecats',
authlevel: 'OVERLORD'
}, {
clientId: 'anotherUniqueClientId',
user: 'Alice',
password: 'boblikescats',
authlevel: 'MINION'
}]}
Run Code Online (Sandbox Code Playgroud)
然后,您可能拥有与不同身份验证级别相对应的操作.您可以使用中间件映射,但是您需要了解有关正在执行的操作的更多具体细节,它似乎更像是"与执行相关"的代码.但是,它不需要了解有关国家的任何信息.它只需要决定将哪些动作转发给减速器.
所以?这样的代码会用于reducer还是中间件?任何人都可以提供其他具体的例子来澄清两者之间的区别吗?
将Promise的回调定义为异步似乎存在一些固有的错误:
return new Promise(async (resolve, reject) => {
const value = await somethingAsynchronous();
if (value === something) {
return resolve('It worked!');
} else {
return reject('Nope. Try again.');
}
});
Run Code Online (Sandbox Code Playgroud)
这显然是一个反模式,并且可能会产生编码问题.我理解,即使await在try/ catch块中放置语句,也很容易在此处捕获错误.
我的第一个问题是,当一个人想要转发具有不同解析/拒绝值的Promise时,最好的方法是什么?用then/catch?即
return new Promise((resolve, reject) => {
somethingAsynchronous().then(value => {
if (value === something) {
return resolve('It worked!');
} else {
return reject('Nope. Try again.');
}
}); // errors would now be propagated up
});
Run Code Online (Sandbox Code Playgroud)
或者你只是按照这里的 …
我目前正在将一个项目迁移到 JDK 11 并使用 Maven 进行编译。但是,Maven 在单个方法引用上出现了问题(它在其他地方没有问题)。有问题的方法如下所示:
public class MyThing {
boolean something = true;
// ...
public boolean isSomething() {
return something;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
对上述方法的调用或多或少是这样的:
return methodThatGetsOptionalDefinition(aString) // Optional<Definition>
.map(definition -> defenition.getMyThing(anotherString)) // Optional<MyThing>
.map(MyThing::isSomething) // Optional<Boolean>
.orElse(true);
Run Code Online (Sandbox Code Playgroud)
编译这个,Maven 会抛出以下消息:
> mvn clean install -Pdist-snapshot -DskipTests
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project XXXXX: Compilation failure
[ERROR] /D:/XXXXX.java:[63,38] incompatible types: invalid method reference
[ERROR] method isSomething in class XXXXX.MyThing cannot be applied to given types …Run Code Online (Sandbox Code Playgroud) 我有一个动作,它接受sfGuard保护的POST数据.这意味着如果用户未登录,POST数据将被发送到登录表单.通常,这不是问题,用户继续登录,并且必须再次提交数据.
不幸的是,登录表单似乎使用POST数据,就好像它是与表单本身一起提交的.这意味着它抱怨所需的用户名和密码字段丢失,并且它抱怨它缺少CSRF令牌.无论如何,在提交表单后,最后一个问题不会消失,这意味着用户无法登录.
如果没有登录,则不应向用户显示表单,但用户可能可以在表单仍然打开的情况下注销.所以我要求保持界面的防水和无错误.
这是sfGuard的缺点,可以避免,还是我做错了?
澄清一下,路线如下:
add_subgroup:
url: /group/:id/add
class: sfPropelRoute
options:
model: Group
type: object
param: { module: subgroups, action: create }
requirements:
group_id: \d+
sf_method: [post]
Run Code Online (Sandbox Code Playgroud)
用于提交请求的表单如下:
<form action="<?php echo url_for('add_subgroup', $group) ?>" method="post">
<input type="hidden" name="group_id" value="<?php echo $group->getId() ?>" />
<input type="text" name="subgroup_id" />
<input type="submit" class="button" value="Add" />
</form>
Run Code Online (Sandbox Code Playgroud) 我有一个由多个容器(在 Windows 上运行的 Linux 容器)使用的 Docker 卷。我希望能够通过 Windows 资源管理器从 Windows 计算机访问卷,最好使用网络驱动器,例如:
services:
smbd:
image: dperson/samba
ports:
- "445:445/tcp"
volumes:
- data:/public
...
volumes:
data:
external:
name: mydrive
Run Code Online (Sandbox Code Playgroud)
在 Windows 中,我可以将驱动器 Z: 连接到\\docker.ip.address\public并能够查看其内容,例如,如果mydrive上面的卷包含子文件夹mystuff,我会在 Windows 上看到以下内容:
- Z:\mystuff
Run Code Online (Sandbox Code Playgroud)
问题是,445 已经在本地主机上使用(当然对于 SMB),并且不能使用其他端口,因为 SMB 是无情的。如果你使用虚拟机就没有问题,因为虚拟机有自己的适配器和IP,所以445又免费了。
一种可能性可能是通过不同的适配器连接 Docker(而不是尝试使用localhost:445),但我不知道如何在 Windows 上做到这一点。
需要 SMB(而不是直接通过资源管理器访问托管卷)的原因是为了可以在 Docker 中轻松切换卷。对于我来说,仍然适用于 Docker 卷的替代方案也可以。
我想在我的项目中使用 Spring Boot WebClient 来访问 REST-API。第一个请求执行 REST-API 登录并接收 cookie 作为响应。此 cookie 用作所有其他请求的“API 令牌”。
然而,WebClient似乎不存储cookie。我必须自己做吗?如果是这样,最好的方法是什么?
以下是我的示例源代码。第二个请求不使用第一个请求的 cookie。
// ### 1. API-Call to get the cookie ###
ClientResponse clientResponse = webClient
.get()
.uri("/api/")
.headers(headers -> headers.setBasicAuth(user,passwd)
.exchange()
.block();
// ### Debug Cookie ###
if (clientResponse.statusCode().is2xxSuccessful()) {
for (String key : clientResponse.cookies().keySet()) {
LOG.debug("key:" + key + " value: " + clientResponse.cookies().get(key).get(0).getValue() );
}
}
// ### 2.API-Call (with cookie) ###
webClient
.get()
.uri("/api/document/4711")
.retrieve()
.onStatus(HttpStatus::is2xxSuccessful, r -> {
for (String key : …Run Code Online (Sandbox Code Playgroud) 我只是想知道在承诺中运行的“同步”函数是同步的(并减慢其他东西)还是异步的,就像我想的那样?
例子:
function getFileContent(filepath){
return new Promise((resolve, reject) => {
fs.readFileSync("asd.txt"));
});
}
Run Code Online (Sandbox Code Playgroud) 在普通字符串中,我可以${variable}用反斜杠转义:
"You can use \${variable} syntax in Kotlin."
Run Code Online (Sandbox Code Playgroud)
是否可以在字符串文字中做同样的事情?反斜杠不再是转义字符:
// Undesired: Produces "This \something will be substituted.
"""This \${variable} will be substituted."""
Run Code Online (Sandbox Code Playgroud)
到目前为止,我看到的唯一解决方案是字符串连接,它非常丑陋,嵌套插值,这开始变得有点荒谬:
// Desired: Produces "This ${variable} will not be substituted."
"""This ${"\${variable}"} will not be substituted."""
Run Code Online (Sandbox Code Playgroud) 我最近升级到Propel 1.5,并开始在Criteria上使用它的Query功能.我有一个无法翻译的查询 - 但是有多个条件的左连接:
SELECT * FROM person
LEFT JOIN group_membership ON
person.id = group_membership.person_id
AND group_id = 1
WHERE group_membership.person_id is null;
Run Code Online (Sandbox Code Playgroud)
其目的是找到不在指定组中的所有人.以前我使用以下代码来完成此任务:
$criteria->addJoin(array(
self::ID,
GroupMembershipPeer::GROUP_ID,
), array(
GroupMembershipPeer::PERSON_ID,
$group_id,
),
Criteria::LEFT_JOIN);
$criteria->add(GroupMembershipPeer::PERSON_ID, null, Criteria::EQUAL);
Run Code Online (Sandbox Code Playgroud)
我考虑为该组中的所有人执行查询,获取主键并NOT IN在阵列上添加一个,但似乎没有一种特别简单的方法从查找中获取主键,并且它看起来不是很优雅.
codenugget.org上的一篇文章详细介绍了如何为连接添加额外条件,我试图:
$result = $this->leftJoin('GroupMembership');
$result->getJoin('GroupMembership')
->addCondition(GroupMembershipPeer::GROUP_ID, $group->getId());
return $result
->useGroupMembershipQuery()
->filterByPersonId(null)
->endUse();
Run Code Online (Sandbox Code Playgroud)
不幸的是,'useGroupMembershipQuery'会覆盖左连接.为了解决这个问题,我尝试了以下代码:
$result = $this
->useGroupMembershipQuery('GroupMembership', Criteria::LEFT_JOIN)
->filterByPersonId(null)
->endUse();
$result->getJoin('GroupMembership')
->addCondition(GroupMembershipPeer::GROUP_ID, $group->getId());
return $tmp;
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这会导致由于某种原因执行交叉连接:
SELECT * FROM `person`
CROSS JOIN …Run Code Online (Sandbox Code Playgroud) asynchronous ×2
java ×2
javascript ×2
node.js ×2
symfony1 ×2
async-await ×1
docker ×1
ecmascript-6 ×1
java-11 ×1
java-8 ×1
java-stream ×1
join ×1
kotlin ×1
lambda ×1
maven ×1
middleware ×1
mysql ×1
php ×1
post ×1
promise ×1
propel ×1
react-redux ×1
reactjs ×1
redux ×1
sfguard ×1
smb ×1
spring ×1
spring-boot ×1
symfony-1.4 ×1