程序员老鬼

某公司技术leader:如果你不想加班,周日不看消息,想准时上下班的,请离开我的团队,这里不养大爷!

刚刷到一个贴子,说某公司技术leader放话:“不想加班、周日不看消息、想准时上下班的,都可以离开团队,这里不养大爷!”

Image

作为程序员,我第一反应就是:这种领导怕是还停留在上个时代。写代码本来就很烧脑,持续透支只会让Bug更多,效率更低。网友里有人说“干不下去就走”,我部分认同,但问题是行业里这种文化太普遍,换家公司也可能一样。

从技术角度讲,真正优秀的团队是靠流程和管理来保证产出,而不是靠无限加班“人海战术”。如果一个leader只能用“压榨”来驱动,那说明他没能力做合理排期。再说了,程序员不是螺丝钉,创造力和专注度才是生产力。⚡

总的来说,健康的团队应该讲究结果导向+合理节奏,而不是把员工当电池用。【备注:文末可领最新资料】

算法题:带有占位符的部分函数

昨晚十一点多,在公司楼下吹风儿,手机一震,小李问我“哥,Java 里能不能像 lodash 那样,先把函数一部分参数定死,剩下的用占位符补?”我当时就回他:能,思路不难,就是别把“部分函数”和“偏应用”混了。

就是那个…怎么说呢…数学里的“部分函数”指的是有些输入没定义,比如 f(x)=1/x 在 x=0 没定义;而我们今天要搞的是“偏应用 + 占位符”,意思是先把函数的一些参数提前填好,空着的地方用“_”占个位,过会儿再补上。这玩意在构建流水线、复用格式化逻辑、拼装策略时很好用,写起来像搭积木。

Java 没内置占位符偏应用,我们自己撸一个。核心点三个: 1)定义一个占位符常量,别跟 null 搞混; 2)记录一共空了几个坑; 3)真正调用时按“从左到右”的顺序把传入的补丁值塞回去。

下面放代码,别嫌长,能跑也清晰:

import java.util.function.Function;

@FunctionalInterface
interfaceTriFunction<A,B,C,R> {
R apply(A a, B b, C c);
}

publicclassPartial{
privateenum Placeholder { INSTANCE }
publicstaticfinal Object _ = Placeholder.INSTANCE; // 占位符,和 null 区分

publicstatic <A,B,C,R> Function<Object[], R> partial(
            TriFunction<A,B,C,R> f, Object a, Object b, Object c) {
int holes = countHoles(a,b,c);
return rest -> {
if (rest == null) rest = new Object[0];
if (rest.length != holes) {
thrownew IllegalArgumentException("需要补 " + holes + " 个参数,但只给了 " + rest.length);
            }
int i = 0;
@SuppressWarnings("unchecked")
            A aa = (a == _) ? (A) rest[i++] : (A) a;
@SuppressWarnings("unchecked")
            B bb = (b == _) ? (B) rest[i++] : (B) b;
@SuppressWarnings("unchecked")
            C cc = (c == _) ? (C) rest[i++] : (C) c;
return f.apply(aa, bb, cc);
        };
    }

privatestaticintcountHoles(Object... xs){
int c = 0; for (Object x : xs) if (x == _) c++; return c;
    }

// 演示
publicstaticvoidmain(String[] args){
        TriFunction<Integer,Integer,Integer,Integer> sum3 = (x,y,z) -> x + y + z;

// 中间留坑:_ 表示占位
        Function<Object[], Integer> add10x = partial(sum3, _, 10, _);
        System.out.println(add10x.apply(new Object[]{1, 2})); // 1 + 10 + 2 = 13

        TriFunction<Integer,Integer,Integer,String> ymd =
                (y,m,d) -> String.format("%04d-%02d-%02d", y, m, d);

// 固定年和月,日留坑
        Function<Object[], String> aug2025 = partial(ymd, 2025, 8, _);
        System.out.println(aug2025.apply(new Object[]{28})); // 2025-08-28

// 注意:null 也是合法实参,占位符必须用 Partial._
        Function<Object[], String> nullDemo = partial(
                (String a, String b, String c) -> String.valueOf(a) + b + c,
                _, null, _);
        System.out.println(nullDemo.apply(new Object[]{"A", "C"})); // A null C
    }
}

你想啊,很多时候我们在流里 map/flatMap,总想把“大函数”拆成“半成品”,先钉死一部分上下文(比如固定日期的前两段、固定税率、固定折扣方案),剩下的按需补。占位符的顺序是从左往右,脑子里无需记参数名,阅读成本低。而且我们用的是一个单例占位符对象,和 null 不会撞车,线程安全也没毛病(没有共享可变状态)。

有人问我“能不能自动推断还差几个参数,不用 Object[]?”可以,但要写成一堆 BiFunction/QuadFunction/... 的重载,代码量蹭蹭上去。上面这个版本取了个折中:用 Object[] 做补丁参数,换来实现简单和可读。再就是…那个…占位数量要对得上,不然直接扔异常,早失败早定位。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404