小编hol*_*ava的帖子

何时在Kotlin中使用内联函数?

我知道内联函数可能会提高性能并导致生成的代码增长,但我不确定何时正确使用它.

lock(l) { foo() }
Run Code Online (Sandbox Code Playgroud)

编译器可以发出以下代码,而不是为参数创建函数对象并生成调用.(来源)

l.lock()
try {
  foo()
}
finally {
  l.unlock()
}
Run Code Online (Sandbox Code Playgroud)

但我发现kotlin没有为非内联函数创建的函数对象.为什么?

/**non-inline function**/
fun lock(lock: Lock, block: () -> Unit) {
    lock.lock();
    try {
        block();
    } finally {
        lock.unlock();
    }
}
Run Code Online (Sandbox Code Playgroud)

function inline-functions kotlin

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

什么是Kotlin lambda体内的"它"?

例如,在以下两个代码中:

File("./file1.txt").forEachLine { println(it) }
Run Code Online (Sandbox Code Playgroud)

File("somefile.txt").bufferedWriter().use { out ->
    history.forEach {
        out.write("${it.key}, ${it.value}\n")
    }
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中it意味着什么?

java jvm file kotlin

24
推荐指数
3
解决办法
7534
查看次数

如何通过element的属性将集合转换/转换为另一个集合?

如果我在Kotlin中有一个对象的集合,有没有一种快速的方法来获取这些对象的某个属性的集合?我查看了Kotlin收集操作列表,但没有什么能让我感到高兴(但我可能忽略了一些东西)

在python中它将类似于:

[person.name for person in persons]

而且我更喜欢使用集合函数而不是:

var nameMap = mutableListOf<String>()
persons.forEach{person -> nameMap.add(person.name)}
Run Code Online (Sandbox Code Playgroud)

我非常缺乏过滤/ lambda函数以及除列表理解之外的任何知识,所以如果这是一个简单的问题就道歉

collections filter kotlin

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

为什么Kotlin收到这样的UndeclaredThrowableException而不是ParseException?

我有一个extension方法,在Kotlin中将字符串转换为Date.

fun String.convertToDate() : Date {
  var pattern: String = "dd-mm-yyyy"
  val dateFormatter = SimpleDateFormat(pattern)
  return dateFormatter.parse(this) // parse method throw ParseException
}
Run Code Online (Sandbox Code Playgroud)

这是我试图捕获可能的异常的代码.

    try {
        "22---2017".convertToDate()
    } catch (ex: ParseException) {
        // ParseException supposed to be caught in this block

        logger.error("Parse exception occur")      
    } catch (ex: Exception) {

        // ParseException caught in this block

        logger.error("Exception occur")            
    }
Run Code Online (Sandbox Code Playgroud)

ParseException过去块就是抓住了Exception被捕获.但它应该在ParseException块中捕获吗?我在这里错过了什么?

=== 更新 ===

我正在开发一个Spring MVC项目.我已经在简单的独立kotlin程序中运行代码,其中它的行为相应.但在我的春季项目中,它表现不同.我给出了完整的代码ControllerService图层.

调节器

@PostMapping
@PreAuthorize("hasAnyRole('USER','ROLE_USER','ROLE_ADMIN','ADMIN')")
fun postAttendance(@RequestBody attendanceJson: …
Run Code Online (Sandbox Code Playgroud)

java exception-handling try-catch kotlin

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

如何将CharArray/Array <Char>转换为String?

CharArray的内容是如下字符:

val chars = arrayOf('A', 'B', 'C')
Run Code Online (Sandbox Code Playgroud)

要么

val chars = "ABC".toCharArray()
Run Code Online (Sandbox Code Playgroud)

我想从中获取字符串"ABC".我该怎么做?

chars.toString()不起作用; 它就好像chars是一个普通的整数数组.

arrays string kotlin

12
推荐指数
1
解决办法
6370
查看次数

Kotlin中的前提条件功能 - 良好实践

我想知道,作为一个新手Kotlin编码器,是否有一些良好的实践甚至语言结构来声明函数的前置条件.

在Java中,我一直在使用Guava的Preconditions检查实用程序:

https://github.com/google/guava/wiki/PreconditionsExplained

经过一些进一步的调查后,我遇到了require函数:

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/require.html

这通常用于检查函数的前提条件吗?

preconditions kotlin

9
推荐指数
1
解决办法
1360
查看次数

如何递归引用泛型参数?

我已经解决了Y-combinator问题.刚才我发现我不能递归地引用泛型参数.

Y = ?f.(?x.f (x x)) (?x.f (x x))
Run Code Online (Sandbox Code Playgroud)

例如:

IntUnaryOperator fact = Y(rec -> n -> n == 0 ? 1 : n * rec.applyAsInt(n - 1));

IntUnaryOperator Y(Function<IntUnaryOperator, IntUnaryOperator> f) {
    return g(g -> f.apply(x -> g.apply(g).applyAsInt(x)));
}

IntUnaryOperator g(G g) {
    return g.apply(g);
}

//        v--- I want to remove the middle-interface `G`
interface G extends Function<G, IntUnaryOperator> {/**/}
Run Code Online (Sandbox Code Playgroud)

:如何在方法上使用泛型参数g以避免引入额外的接口G,并且泛型参数应该避免UNCHECKED警告?

提前致谢.

java generics functional-programming java-8

9
推荐指数
1
解决办法
160
查看次数

Java将java.lang.Object列表中的特定类列表添加到java 8流中 - 为什么?

public class Test {

    static List<Object> listA = new ArrayList<>();

    public static void main(final String[] args) {
        final List<TestClass> listB = new ArrayList<>();
        listB.add(new TestClass());

        // not working
        setListA(listB);

        // working
        setListA(listB.stream().collect(Collectors.toList()));

        System.out.println();
    }

    private static void setListA(final List<Object> list) {
        listA = list;
    }

}
Run Code Online (Sandbox Code Playgroud)

为什么它适用于流,并不适用于简单的集合?

java generics inheritance java-8 java-stream

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

为什么Mockito不能在Kotlin中使用数字类型模拟通用参数类型?

我们正在将项目转移到Kotlin语言.我们决定从测试开始,但面临一些奇怪的行为.

这是我们的测试用例:

Service.java

public final class Service {
    private final JdbcTemplate jdbcTemplate;

    public Service(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public long check() {
        return jdbcTemplate.queryForObject("SELECT COUNT(*) FROM table", Long.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

JavaTest.java(工作正常)

@RunWith(MockitoJUnitRunner.class)
public final class JavaTest {
    @Mock
    private JdbcTemplate jdbcTemplate;

    @InjectMocks
    private Service testSubject;

    @Test
    public void test() {
        //given
        when(jdbcTemplate.queryForObject(anyString(), eq(Long.class))).thenReturn(1L);

        //when
        long result = testSubject.check();

        //then
        assertThat(result, is(1L));
    }
}
Run Code Online (Sandbox Code Playgroud)

KotlinTest.kt(不工作)

@RunWith(MockitoJUnitRunner::class)
class KotlinTest {
    @Mock
    private lateinit var jdbcTemplate: JdbcTemplate

    @InjectMocks
    private …
Run Code Online (Sandbox Code Playgroud)

java junit unit-testing mockito kotlin

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

如何在Kotlin中创建固定大小的IntArray并在以后初始化数组?

我只是在kotlin的初级水平.我没有任何办法在kotlin中为数组添加值.我想从用户获取值并将它们添加到数组中.

val arr = arrayOf<Int>()
Run Code Online (Sandbox Code Playgroud)

要么

var arr = intArrayOf()
Run Code Online (Sandbox Code Playgroud)

像在Java中一样

Scanner ob=new Scanner(System.in);
int arr[]=new int[5];
for(int i=0;i<arr.length;i++)
{
arr[i]=ob.nextInt();
}
Run Code Online (Sandbox Code Playgroud)

如何在kotlin中执行相同的操作?

arrays kotlin

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