小编Dav*_*oko的帖子

如何编译使用hamcrest'的'Kotlin单元测试代码'是'

我想为我的Kotlin代码编写单元测试并使用junit/hamcrest匹配器,我想使用该is方法,但它是Kotlin中的保留字.

如何编译以下内容?

class testExample{
  @Test fun example(){
    assertThat(1, is(equalTo(1))
  }
}
Run Code Online (Sandbox Code Playgroud)

目前我的IDE,InteliJ强调,作为一个编译错误,说它期待一个)is

junit unit-testing hamcrest kotlin

23
推荐指数
3
解决办法
5655
查看次数

lambda中的vararg参数

我想定义一个函数f()如下:

val f: (vararg strings: String) -> Unit = { for (t in it) println(t) }
Run Code Online (Sandbox Code Playgroud)

所以我可以调用它f("a","b","c").对于上面的定义f()我得到了编译错误(指向vararg修饰符):

Unsupported [modifier on parameter in function type]
Run Code Online (Sandbox Code Playgroud)

如何定义接受vararg参数的lambda ?

lambda kotlin

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

引用Kotlin类属性setter作为函数

在下面的示例中,t::x返回对属性getter的引用.如何为二传手获得同样的东西?

class Test(var x: String) {}

fun main(args: Array<String>) {
    val t = Test("A")

    val getter: () -> String = t::x
    println(getter()) // prints A

    val setter: (String) -> Unit = ????
}
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-reflect

10
推荐指数
3
解决办法
1109
查看次数

在 Kotlin 中生成 MD5 哈希的最佳方法是什么?

在 Kotlin 中使用标准库生成字符串的 MD5 哈希的最佳方法是什么?

我试过下面提到的代码

import java.math.BigInteger
import java.security.MessageDigest

fun md5(input:String): String {
    val md = MessageDigest.getInstance("MD5")
    return BigInteger(1, md.digest(input.toByteArray())).toString(16).padStart(32, '0')
}
Run Code Online (Sandbox Code Playgroud)

这是最好的方法还是哪种方法?

security hash md5 sha kotlin

9
推荐指数
3
解决办法
8425
查看次数

Java G1GC 从不收集 Old Gen

我正在运行我的万无一失的测试,它让我进入了 GC 开销限制。然而,在分析内存统计数据和快照后,我意识到几乎 800 MB 的内存被浪费在字符串复制中。

进一步研究 VM 参数和其他运行时参数,我意识到使用的 GC 是 PS(Parallel Scavenger - JVM 的默认GC)。

我修改了 Surefire argLine 来使用

-XX:+UseG1GC -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics
Run Code Online (Sandbox Code Playgroud)

现在我的测试运行使用的是 G1GC。

下面是切换GC前后的对比

在此输入图像描述

如果您对重复数据删除统计数据感兴趣。这里是: 在此输入图像描述

我的问题:为什么 G1GC 使用了如此多的 Old Gen,并且在测试运行期间没有被收集。它不断增长。

其余的环境和争论以及其他一切都保持不变。唯一改变的是 GC 算法和重复数据删除。

我也一直在查看这些相关主题

JVM G1GC 的混合 gc 没有收集太多旧区域

Java 8 的字符串去重特性

https://openjdk.java.net/jeps/192

java garbage-collection g1gc

8
推荐指数
1
解决办法
4563
查看次数

MongoIterable.forEach与Iterable.forEach

MongoIterable.forEach需要一个Block与Java 8非常相似的东西Consumer.它们足够相似会导致问题,例如,以下内容无法编译:

MongoIterable<Document> result = collection.find(...);
result.forEach(System.out::println); 
Run Code Online (Sandbox Code Playgroud)

因为编译器无法在Iterable.forEach( Consumer ) 和之间做出决定MongoIterable.forEach( Block ).修复此问题需要明确键入参数的解决方法:

Block<Document> printer = System.out::println;
result.forEach(printer);   
Run Code Online (Sandbox Code Playgroud)

或者,MongoIterable作为一个平原处理Stream:

StreamSupport.stream(result.spliterator(), false).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

为什么MongoIterable.forEach没有使用Consumer界面定义,例如:MongoIterable.forEach(Consumer<? super TResult> consumer)?更好 - 为什么要forEach进去MongoIterable呢?

mongodb-java mongo-java-driver

7
推荐指数
1
解决办法
2678
查看次数

在 Spring Boot 中,如何在每次测试之前重置指标注册表?

我有测试并想对千分尺指标做出断言,但测试以随机顺序运行,所以我想在每次测试之前重置或清除所有千分尺指标,这样我的断言总是正确的。

spring-test spring-boot micrometer spring-micrometer

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

Flutter - 如何一直滚动到 ListView 的底部?

我使用这段代码来滚动:

WidgetsBinding.instance?.addPostFrameCallback((_) => _scrollToEnd());
Run Code Online (Sandbox Code Playgroud)

_scrollToEnd()方法是:

_scrollController.animateTo(
  _scrollController.position.maxScrollExtent,
  duration: const Duration(
    milliseconds: 200,
  ),
  curve: Curves.easeInOut,
);
Run Code Online (Sandbox Code Playgroud)

将其想象为一个普通的聊天屏幕。如果消息在 1 行中,它会滚动到裸露的底部。但是,一旦消息达到 2 行以上,它就不会一直滚动到底部。消息的行数越多,滚动到底部的次数就越少。

这是我进入聊天时的样子:

但如果我进一步向下滚动,这就是聊天的底部:

我注意到还有一种情况:

  1. 我进入聊天。
  2. 它像第一张图片一样向下滚动。
  3. 如果我点击屏幕上的任意位置,它会继续滚动到列表视图的裸露底部,就像第二张图片一样。

为什么会发生这种情况以及如何解决这个问题?

mobile android ios dart flutter

7
推荐指数
3
解决办法
7999
查看次数

Kotlin:获取资源文件夹中所有文件的列表

有没有办法获取 Kotlin 中“资源”文件夹中所有文件的列表?

我可以将特定文件读取为

Application::class.java.getResourceAsStream("/folder/filename.ext")
Run Code Online (Sandbox Code Playgroud)

但有时我只想将文件夹“文件夹”中的所有内容提取到外部目录。

谢谢你。

resources classpath kotlin

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

SSL + Java 8 + OpenJDK + SNI + HTTPClient =握手失败

我有一些代码已经工作了很长时间,通过HTTP从webapps获取数据.它使用Apache HTTPClient(v.4.5.2),适用于有和没有SSL的站点.

最近,我试图使用if用于其他恰好使用SNI的网站.一切都在我的Windows机器上运行良好,但如果我尝试在AWS EC2 Linux实例上运行它,我会得到握手失败(因为SNI).

这是我正在运行的:

Windows Java

  • java版"1.8.0_101"
  • Java(TM)SE运行时环境(版本1.8.0_101-b13)
  • Java HotSpot(TM)客户端VM(版本25.101-b13,混合模式,共享)

AWS Linux Java

  • openjdk版本"1.8.0_91"
  • OpenJDK运行时环境(版本1.8.0_91-b14)
  • OpenJDK 64位服务器VM(内置25.91-b14,混合模式)

我不确定哪个组件最终导致失败(Java 8,运行时环境,HTTPClient).

我已经看过这个(https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExtension),但我不知道如何为HTTPClient调整它.此外,如果我必须更改代码,为什么它可以在Windows上运行?

任何人都知道我应该做什么?

编辑:根据建议,我查看了jsse.enableSNIExtension属性.这似乎是错误的,因为它似乎是一种关闭SSL的方法,这不是我想要的.

我尝试在Windows上打开/关闭它,事情只适用于它.在Linux上,当它打开时,我继续获得握手失败.

这是输出:

Windows - System.setProperty("jsse.enableSNIExtension", "false");
=================================================================

pool-1-thread-1, WRITE: TLSv1.2 Handshake, length = 189
pool-1-thread-1, READ: TLSv1.2 Alert, length = 2
pool-1-thread-1, RECV TLSv1.2 ALERT:  fatal, internal_error
pool-1-thread-1, called closeSocket()
pool-1-thread-1, handling exception: javax.net.ssl.SSLException: Received fatal alert: internal_error


Windows - System.setProperty("jsse.enableSNIExtension", "true");
================================================================

pool-1-thread-1, WRITE: TLSv1.2 Handshake, length = 215
pool-1-thread-1, READ: TLSv1.2 …
Run Code Online (Sandbox Code Playgroud)

java ssl jce amazon-web-services sni

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