Java 中可以做到函数嵌套吗

23 天前
 DIO

我知道可以通过 Runnable 来让 lambda 前置并在后面调用,而且最终实际上是通过包装成私有函数运行,不会有额外开销。但是有没有办法让子函数体后置,业务代码在前?

函数式编程貌似可以做到。Java 中有没有办法呢。

至于为什么不用 kt ,嗯,公司业务积重难返了。


function parentFunction() {
    // 业务代码部分
    const data = [1, 2, 3, 4, 5];
    
    const doubled = doubleData(data);
    console.log('Doubled Data:', doubled);
    
    const filtered = filterData(doubled, isEven);
    console.log('Filtered Data (Even):', filtered);
    
    // 子函数定义部分
    function doubleData(arr) {
        return arr.map(function(num) {
            return multiply(num, 2);
        });
    }

    function multiply(a, b) {
        return a * b;
    }

    function filterData(arr, predicate) {
        const result = [];
        for (let i = 0; i < arr.length; i++) {
            if (predicate(arr[i])) {
                result.push(arr[i]);
            }
        }
        return result;
    }

    function isEven(num) {
        return num % 2 === 0;
    }
}


fun parentFunction() {
    // 业务代码部分
    val data = listOf(1, 2, 3, 4, 5)
    
    val doubled = doubleData(data)
    println("Doubled Data: $doubled")
    
    val filtered = filterData(doubled, ::isEven)
    println("Filtered Data (Even): $filtered")

    // 子函数定义部分
    fun doubleData(arr: List<Int>): List<Int> {
        return arr.map { multiply(it, 2) }
    }

    fun multiply(a: Int, b: Int): Int {
        return a * b
    }

    fun filterData(arr: List<Int>, predicate: (Int) -> Boolean): List<Int> {
        return arr.filter(predicate)
    }

    fun isEven(num: Int): Boolean {
        return num % 2 == 0
    }
}

3822 次点击
所在节点    Android
31 条回复
Hilalum
23 天前
caiqichang
23 天前
你这段 kotlin 代码可以运行?
xuanbg
23 天前
lambda 可以把方法作为参数。但是,普通的方法调用你把对象作为参数就行了,没必要非得把对象的方案作为参数啊
xuanbg
23 天前
对象的方法,不是方案。笔误
Belmode
23 天前
Java 做不到。一种语言有一种语言的范式,别套。
layxy
23 天前
lambda 可以在函数内定义函数,但是必须在调用前定义
ychost
23 天前
我们也是在历史业务里面嵌入 kotlin 的,慢慢迭代呗不存在积重难返,kt 和 java 交互没啥卡点,甚至还可以把 Groovy 加进来作为扩展点
Dropless
23 天前
题外话, C# 的函数支持这样, 就跟 js 里一样, 一般叫 local function. 一个函数里有大量的 local function 肯定是不推荐的, 不过 js 里因为有闭包的需求, 这种范式倒是不少见. 如果一个函数(A)太长, 那么可以把部分代码单独作为另外一个函数(B), 如果 B 只会被 A 调用, 那么把 B 作为 A 的 local function 是合理的, 这样可以减轻对类成员的"污染"
xiangyuecn
23 天前
我的 java 骚操作,可以让 java 函数返回多个结果,用在闭包里面也是一样的,原理就是 1 个元素的数组

final Func[] xxx=new Func[]{ null }

.... 你的 lambda{
xxx[0].xxx()
}

xxx[0]=()->{} 你的函数定义放后面
Cbdy
23 天前
Java 不是可以定义 Lambda 吗?
netabare
23 天前
没有办法做到,某种程度上说这是 Java 的一大缺陷了。

放心,以后也不会修,因为这个功能养活了许多设计模式。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1097182

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX