Functional programming 如何最好地在嵌套列表中查找元素?

Functional programming 如何最好地在嵌套列表中查找元素?,functional-programming,stream,kotlin,Functional Programming,Stream,Kotlin,Kotlin提供了一些有用的扩展函数,允许流式编程 例如,如果我在列表中查找元素,我可以使用find: return list.find { n -> n>4 && n<6 } 在我看来,forEach并不是合适的工具。有没有更实用的方法来实现这一点过滤器出现在脑海中,但嵌套会导致问题 下面是我对above函数使用的测试: @Test open fun findTest() { val data = listOf( listOf(1,2,3), lis

Kotlin提供了一些有用的扩展函数,允许流式编程

例如,如果我在列表中查找元素,我可以使用
find

return list.find { n -> n>4 && n<6 }
在我看来,
forEach
并不是合适的工具。有没有更实用的方法来实现这一点<代码>过滤器出现在脑海中,但嵌套会导致问题

下面是我对above函数使用的测试:

@Test
open fun findTest() {
    val data = listOf( listOf(1,2,3), listOf(3,4,5,6), listOf(), listOf(6,7,8) )
    val e = findUsingForEach( data, { n -> n>4 && n < 6 } )
    assertEquals(5, e.get())
}
@测试
开放有趣的findTest(){
val data=listOf(listOf(1,2,3),listOf(3,4,5,6),listOf(),listOf(6,7,8))
val e=findUsingForEach(数据,{n->n>4&&n<6})
assertEquals(5,e.get())
}

如果您只想减少代码,而不太关心效率,请尝试以下方法

list.flatten().find { your pred here }

或者创建一个不创建新列表的实用程序(占用的内存更快/更少):

inlinefuniterable.forEachEach(f:(T)->Unit)=
forEach{it.forEach(f)}

如果您只想减少代码,而不太关心效率,请尝试以下方法

list.flatten().find { your pred here }

或者创建一个不创建新列表的实用程序(占用的内存更快/更少):

inlinefuniterable.forEachEach(f:(T)->Unit)=
forEach{it.forEach(f)}
您可以查看以下列表:

fun Iterable.flatte():列表
()

返回给定集合中所有集合的所有元素的单个列表

变成

{1, 2, 3, 3, 4, 5, 6, 6, 7, 8}
在该列表上查找的结果是
5

但是,这将创建一个新列表。查看
展平
的源代码:

/**
 * Returns a single list of all elements from all collections in the given collection.
 */
public fun <T> Iterable<Iterable<T>>.flatten(): List<T> {
    val result = ArrayList<T>()
    for (element in this) {
        result.addAll(element)
    }
    return result
}
然后在此序列上执行操作:

data.asSequence().flatten().find { n -> n > 4 && n < 6 }
data.asSequence().flant().find{n->n>4&&n<6}

旁注:您的谓词
n>4&&n<6
,仅相当于
n==5

您可以从列表中选择:

fun Iterable.flatte():列表
()

返回给定集合中所有集合的所有元素的单个列表

变成

{1, 2, 3, 3, 4, 5, 6, 6, 7, 8}
在该列表上查找的结果是
5

但是,这将创建一个新列表。查看
展平
的源代码:

/**
 * Returns a single list of all elements from all collections in the given collection.
 */
public fun <T> Iterable<Iterable<T>>.flatten(): List<T> {
    val result = ArrayList<T>()
    for (element in this) {
        result.addAll(element)
    }
    return result
}
然后在此序列上执行操作:

data.asSequence().flatten().find { n -> n > 4 && n < 6 }
data.asSequence().flant().find{n->n>4&&n<6}

旁注:您的谓词,
n>4&&n<6
,只相当于
n==5

data.asSequence()
data.asSequence().flatten().find { n -> n > 4 && n < 6 }