小编Jul*_*ian的帖子

Java 8从Map中的匹配值中提取第一个键

假设我有一个给定名称,姓氏对的地图,我想找到该地图中第一个条目的名称,该名称的姓氏与某个值相匹配.我们如何以java 8的方式做到这一点.

在我下面的测试用例中,我提出了两种方法.

然而,第一个(寻找姓氏为"Donkey"的第一个人的名字)将抛出java.util.NoSuchElementException:没有值存在,因此它不安全.

第二个工作,但它不仅难以阅读,但它有点不太实用.

只是不知道是否有人在这里会建议我实现这个要么使用一个更简单更清晰的方式stream()forEach()或两者兼而有之.

@Test
public void shouldBeAbleToReturnTheKeyOfTheFirstMatchingValue() throws Exception {
    Map<String, String> names = new LinkedHashMap<>();
    names.put("John", "Doe");
    names.put("Fred", "Flintstone");
    names.put("Jane", "Doe");
    String keyOfTheFirst = names.entrySet().stream().filter(e -> e.getValue().equals("Doe")).findFirst().get().getKey();
    assertEquals("John", keyOfTheFirst);

    try {
        names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst().get();
    } catch (NoSuchElementException e){
        // Expected
    }

    Optional<Map.Entry<String, String>> optionalEntry = names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst();
    keyOfTheFirst = optionalEntry.isPresent() ? optionalEntry.get().getKey() : null;

    assertNull(keyOfTheFirst);
}
Run Code Online (Sandbox Code Playgroud)

先感谢您.

java lambda optional java-8 java-stream

19
推荐指数
1
解决办法
5万
查看次数

如何全局设置 jdk.attach.allowAttachSelf=true

我正在尝试将我们的一个系统从 java 8 移动到 java 9,并且大约三分之一在 java 8 中正常工作的单元测试失败并出现以下错误:

java.io.IOException: Can not attach to current VM
Run Code Online (Sandbox Code Playgroud)

Google 带我看了几页,我很快就明白在 Java 9 中,默认行为已更改,以防止附加到当前 VM 并返回到您需要将系统属性设置jdk.attach.allowAttachSelf为 true的旧方式。

在 IntelliJ 中设置时,测试工作正常。更改 build.gradle 以包含此内容时,同样有效:

test {
    jvmArgs '-Djdk.attach.allowAttachSelf=true'
}
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢全局设置此设置,因此我不需要破解我的 build.gradle 和 IntelliJ。

我在 ubuntu 上运行 java 9 并更改/etc/profile.d/jdk.sh为包含以下内容:

export JDK_JAVA_OPTIONS="-Djdk.attach.allowAttachSelf=true"
Run Code Online (Sandbox Code Playgroud)

当运行我的 Gradle 构建时,我可以看到设置被拾取,因为我在构建输出中低于:

NOTE: Picked up JDK_JAVA_OPTIONS: -Djdk.attach.allowAttachSelf=true
Run Code Online (Sandbox Code Playgroud)

但是,测试不断失败,并出现相同的 IOException。

那么我做错了什么,我该如何解决?

预先感谢您的意见。

java java-9

19
推荐指数
1
解决办法
4419
查看次数

选择列表的元素,直到Java 8 Lambdas满足条件

我试图改变主意思考功能方式,并且最近面临一种情况,我需要从列表中获取元素,直到满足条件,我找不到一种简单的自然方式来实现这一点.显然我还在学习.

说我有这个清单:

List<String> tokens = Arrays.asList("pick me", "Pick me", "pick Me",
    "PICK ME", "pick me and STOP", "pick me", "pick me and Stop", "pick me");

// In a non lambdas was you would do it like below
List<String> myTokens = new ArrayList<>();
for (String token : tokens) {
    myTokens.add(token);
    if (token.toUpperCase().endsWith("STOP")) {
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

提前感谢您的意见

注意:在发布之前,我读了一个谓词限制流,但我看不出如何能够根据我的问题调整答案.任何帮助将不胜感激.

java lambda java-8 java-stream

15
推荐指数
4
解决办法
1万
查看次数

将属性传递给gradle构建

我承认我很贪心,但我没想到会像下面的例子那样简单地理解.我可以使用hasProperty(String propertyName)调用来阅读关于检查是否已设置项目属性的gradle文档,我坐在这里并且不知道为什么这么基本的东西不起作用.

我相信我的思想必须如此"蚂蚁般",因为我确实缺少一些普通的基本知识

task printSystem() << {
    println system
    println "has property: " + hasProperty("system")
}
Run Code Online (Sandbox Code Playgroud)

并使用以下命令调用该任务:

$gradle printSystem -Psystem=mySystem
mySystem
has property: null
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 为什么系统打印出来但是有物业回报null
  2. 我应该如何检查是否存在名为"system"的项目属性?
  3. 是否有不同的方法来测试项目属性而不是系统属性?
  4. 你如何从命令行传递系统属性?

这是来自gradle文档,我相信我正在阅读它

19.2.1.检查项目属性

您可以使用其名称来访问构建脚本中的项目属性,就像使用变量一样.如果此属性不存在,则将抛出异常并且构建将失败.如果构建脚本依赖于用户可能设置的可选属性(可能在gradle.properties文件中),则需要在访问它们之前检查是否存在.您可以使用返回true或false的方法hasProperty('propertyName')来完成此操作.

gradle

14
推荐指数
1
解决办法
1万
查看次数

Findbugs排除生成的文件

我试图从findbugs检查过滤掉生成的文件,我尝试的所有文件似乎都不起作用.几乎是我的构建过程的一部分,我创建了很多类,最终在一个名为src/generated的文件夹中,我有兴趣过滤掉所有这些类.我正在使用maven,但我认为这不重要.

先感谢您.

ant findbugs maven

11
推荐指数
1
解决办法
7514
查看次数

BLOB URL的自定义名称

我们有一个Angular应用程序,它获取一些输入参数并将它们发送到后端进行处理.处理结果是我们想要在新选项卡中打开的pdf文件.

执行此操作的代码与以下内容类似:

myService.getDocument(document)
  .then(function(response) {
    if (response.error) {
      // Error handling goes here
    } else {
      var file = new BLob([response.data), {type: 'application/pdf'});
      var fileURL = URL.createObjectURL(file);
      $window.open(fileURL, '_blank_');
    }
  });
Run Code Online (Sandbox Code Playgroud)

一切正常,但浏览器中的URL显示一些随机生成的字符串,如下所示:

blob:http://localhost:3000/85cad96e-e44e-a1f9-db97a96ed3fe
Run Code Online (Sandbox Code Playgroud)

显然这对最终用户来说看起来不太好,我们更愿意展示对用户有意义的东西,如下所示:

blob:ftp://localhost:3000/my_document_name_or_whatever
Run Code Online (Sandbox Code Playgroud)

我是JS的新手,是Angular的新手,是HTML的新手,希望我的问题听起来不是很天真.

提前感谢您的意见.

javascript angularjs

11
推荐指数
2
解决办法
1万
查看次数

Java REGEX匹配字符串中的确切位数

我试图在问题历史中找到我的问题的答案,但他们只是回来了一千多个,在扫描了几十个匹配的答案后我放弃了.所以这是我的问题.

我希望能够在字符串中找到正好六位数的第一个序列.鉴于字符串"一些文本987654321和一些其他文本123456和一些其他文本再次654321和更多文本到底"我想找到将匹配123456序列的正则表达式.

我是正则表达式的新手,关于它如何工作的简短解释将有很大帮助.

先感谢您

java regex

7
推荐指数
2
解决办法
2万
查看次数

Gradle 配置 TestNG 和 JUnit 报告目录

我对 gradle 比较陌生,我们在项目中使用 JUnit 和 testNG 单元测试。在 google 的帮助下,我弄清楚了如何运行 testNG 和 JUnit 测试。下面是我最终如何实现它的

build.gradle
....    
task testNG(type: Test) {
    useTestNG {}
}

test {
    dependsOn testNG
}
Run Code Online (Sandbox Code Playgroud)

但是,仅生成 JUnit 报告。谷歌再次帮助我通过这个链接https://discuss.gradle.org/t/using-junit-and-testng-together-steps-on-testng-html-file/5484,它展示了如何解决看起来完全一样的问题像我的一样,配置两个单独的测试报告文件夹,如下所示:

testng.testReportDir = file("$buildDir/reports/testng")
test.testReportDir = file("$buildDir/reports/testjunit")
Run Code Online (Sandbox Code Playgroud)

然而,它并没有确切说明将这两个条目放在哪里,我觉得我会疯狂地尝试查看 gradle 书籍、gradle 示例和 API,而不知道如何查看。根据 APItest任务有一个reports属性,您可以在其中配置TestTaskReports实例,但我尝试的任何操作都失败了。你能帮我解决这个问题吗?它一定是太明显的东西,以至于我错过了它。

先感谢您

testing junit gradle

6
推荐指数
1
解决办法
2976
查看次数

嵌入式 Kafka 测试随机失败

我使用 EmbededKafka 实现了一系列集成测试,以测试使用 spring-kafka 框架运行的一个 Kafka 流应用程序。

流应用程序正在从 Kafka 主题读取消息,将其存储到内部状态存储中,进行一些转换并将其发送到另一个微服务到请求的主题中。当响应返回到响应主题时,它会从状态存储中检索原始消息,并根据某些业务逻辑将其转发到我们的下游系统之一,每个下游系统都有自己的主题。

集成测试只是测试业务条件的各种排列。

最初,测试被分成不同的班级。运行构建时,一个类中的测试与另一类中的测试发生冲突,并存在一些冲突异常。我没有花太多时间在这上面,只是将所有测试移到同一个类中。这解决了我从 gradle build 或从 intelij EDI 通过的所有测试的问题。

这是测试:

package au.nab.tlm.streams.integration;

import au.nab.tlm.streams.serde.EntitlementsCheckSerDes;
import au.nab.tlm.streams.test.support.MockEntitlementsCheckSerDes;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.kafka.test.EmbeddedKafkaBroker;
import org.springframework.kafka.test.context.EmbeddedKafka;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;

@SpringBootTest
@ContextConfiguration(classes = {MyTopologiesIntegrationTest.TestKafkaConfig.class})
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
@EmbeddedKafka(
        ports = 9092,
        partitions = 1,
        topics = {
                "topic-1.v1",
                "topic-2.v1",
                "topic-3.v1",
                "topic-4.v1",
                "topic-5.v1",
                "topic-6.v1",
        },
        brokerProperties = {"transaction.state.log.replication.factor=1", "transaction.state.log.min.isr=1", "log.dir=/tmp/embedded-kafka"}
)
public class MyTopologiesIntegrationTest {
    @Autowired
    EmbeddedKafkaBroker kafkaBroker; …
Run Code Online (Sandbox Code Playgroud)

apache-kafka spring-kafka spring-kafka-test

6
推荐指数
1
解决办法
7851
查看次数

如何在异常处理程序中访问访问请求主体

我们有一个 Spring Boot 应用程序,我们的控制器期望在我们的端点之一中有一个 XML 文档元素:

@PostMapping(value = "/api/v1/do-stuff",
        consumes = APPLICATION_XML_VALUE,
        produces = APPLICATION_XML_VALUE)
public ResponseEntity<JAXBElement<my.company.stuff.resposnse.Document>> doStuff(
        @RequestBody JAXBElement<my.company.stuff.request.Document> requestBody,
        Principal principal) throws Exception {

    // Doing some suff here and returning the result
    return stuffService.doStuff(...);
}
Run Code Online (Sandbox Code Playgroud)

我们有自己的 Jaxb2Marshaller 实例,在其中设置请求文档和响应文档的架构,以用于请求和响应主体与域对象之间的编组和取消编组。当请求到来时,Spring Boot框架将在请求主体和域请求文档之间进行转换。有时,请求正文未通过 XSD 架构验证,因此它甚至无法到达我们的控制器。

抛出的异常将传递到我们的自定义扩展,org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler我们希望在其中为应用程序客户端创建最有意义的错误响应:

    @Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex,
            HttpHeaders headers, HttpStatus status, WebRequest request) {
        // Getting access to the request body would be very beneficial here
    }
Run Code Online (Sandbox Code Playgroud)

我们的问题是,有时传递给处理程序的异常没有足够的详细信息,我们希望能够访问请求正文,以便能够自定义对客户端的响应。但是,请求的输入流不再可访问,因为它已从架构验证(转换)处理的一部分中读取,因此任何以这种方式访问​​它的尝试都会失败。

另一方面,我们想要实现的目标是非常常识性的,只是想知道我们是否采取了错误的方法以及什么是更好的设计来实现同样的目标。将控制器更改为期望纯文本并验证并将其转换为控制器内的请求文档并不是真正的选择。

提前感谢您或您的意见。

java spring-boot

5
推荐指数
1
解决办法
6311
查看次数

具有多个使用者但只有一个活动的MQ队列

我们有一个MQ Queue,它从我们控制的外部系统接收消息.我们处理传入消息的系统是一个至关重要的系统,无论如何都需要以27x7的速度运行.

处理传入消息的顺序也是不可协商的,这意味着我们需要按照它们到达的顺序处理它们.

为了确保我们的系统100%可用,我们将系统部署到一堆能够处理这些消息的物理机器上.

一旦消息到达我们的系统,我们就建立了一种机制,以确保消息处理不会出现故障,同时由于并行处理而获得一些性能提升.对我们而言,性能提升是一件好事,但这是一个副作用,因为我们的主要目标是高可用性,同时确保正确的处理顺序.

我的想法是在每台机器上都有一个MDB能够处理传入的消息,但一次只有一个活跃的消费者.

我们使用Webshere MQ作为JMS提供程序,使用Webshere Application Server 8.5来部署我们的应用程序.

多个消费者收听相同队列的问题似乎不是一个可行的解决方案,因为当消息大量到达时,他们将循环传递给所有消费者,并且无法控制这种情况将如何发生以及消息很容易失控.

当我手动停止所有监听器但显然消息按顺序处理时.但手动关闭和启动此类侦听器绝对不是HA解决方案.

我们可以实施监控流程来检查系统的运行状况并关闭或根据需要启动它们,但这对我来说仍然看起来太弱了.实际上我们想要的是让所有的监听器都启动并运行,但只有一个接收消息.如果那个因任何原因而失败,那么坐在那里的另一个将变为活动状态并开始处理消息.

最初我们考虑使用主题而不是队列,但这会带来如下的其他问题:

  1. 我们无法控制消息的来源
  2. 我们所拥有的大量消息会让我们陷入困境,因为我们的用户必须经久耐用,而且在回来时需要处理大量待处理的消息
  3. 输入队列已经是集群的一部分,并且更改所有基础结构将需要大量工作

无论如何,在我看来它必须是一个现有的模式来适应这种情况.任何帮助,建议将不胜感激.

解决方案不一定是特定的MQ,任何想法都是受欢迎的.

提前致谢

websphere messaging transactions jms ibm-mq

4
推荐指数
1
解决办法
3898
查看次数

Gradle无法运行checkstyle

我的笔记本电脑上有一个java项目,我用gradle构建它.所有依赖项都在文件系统中,因为我在处理它时大部分时间都在离线.反正他们并不是太多.

的build.gradle:

repositories {
    flatDir {
        dirs "${rootDir}/lib/main", "${rootDir}/lib/test", "${rootDir}/lib/quality"
    }
}

ext.configDir = "${rootDir}/gradle/config"
ext.scriptsDir = "${rootDir}/gradle/scripts"
Run Code Online (Sandbox Code Playgroud)

现在我需要对我的代码添加一些质量检查.我很幸运能够通过checkstyle检查PMD检查,但不是那么幸运.gradle分发的例子,我读过的动作书中的gradle,gradle文档似乎不是火箭科学,但是我不能让它工作变得非常令人沮丧,特别是那些本来是五分钟任务的蚂蚁.无论如何这是checkstyle的gradle.build条目:

apply from: "${scriptsDir}/checkstyle.gradle"
Run Code Online (Sandbox Code Playgroud)

这是我的checkstyle.gradle(部分显示):

apply plugin: 'checkstyle'

ext.checkstyleConfigDir = new File(configDir, "checkstyle")
ext.checkstyleReportsDir = new File(reportsDir, "checkstyle")
ext.xslStyleFile = new File(checkstyleConfigDir, "checkstyle-noframes.xsl")

checkstyle {
    toolVersion = '6.10.1'
    configFile = new File(checkstyleConfigDir, 'sun_checks.xml')
    ignoreFailures = true
    showViolations = true
}

checkstyleMain.doLast {
    def main = new File(checkstyleReportsDir, "main.xml")
    if (main.exists()) {
        ant.xslt(in: main, style: xslStyleFile, out: new File(checkstyleReportsDir, …
Run Code Online (Sandbox Code Playgroud)

checkstyle gradle

4
推荐指数
1
解决办法
3957
查看次数

在 Mac 上安装/运行 GraalVM 的问题

我使用的是在防火墙后面运行的 MacOS Catalina 10.15.7 计算机。

\n

我开始评估 Micronaut 和 Quarkus 作为 Spring boot 的替代品,其主要原因之一是能够编译为本机映像。

\n

为了能够做到这一点,我必须安装 GraalVM。我按照此处GraalVM Community Edition 20.3.0 的说明下载了 graalvm-ce-java11-darwin-amd64-20.3.0.tar.gz,将其解压缩到我选择的文件夹中,然后导出/Users/myId/work/dev/graalvm/graalvm-ce-java11-20.3.0/Contents/Home/为 GRAALVM_HOME 并添加了 GRALLVM_HOME\\垃圾箱在我的道路上。

\n

之后,我访问https://code.quarkus.io/并上传了一个Hello World要使用 gradle 构建的 Quarkus 项目(6.8)。

\n

当我运行时,gardle build一切都构建正常。\n当我运行时,gradle quarkusDev应用程序启动正常,我可以到达Hello World终点。

\n

但是,当我尝试构建本机映像时,gradle build -Dquarkus.package.type=native出现以下异常

\n
java.lang.RuntimeException: Cannot find the `native-image` in the GRAALVM_HOME, JAVA_HOME and System PATH. Install it using `gu install native-image`\n
Run Code Online (Sandbox Code Playgroud)\n

gu install native-image …

graalvm quarkus graalvm-native-image

3
推荐指数
1
解决办法
2319
查看次数