Вы не можете заменить lambda input -> getValueProvider().apply(input).getValue()
ссылкой на метод без изменения семантики.
Ссылка на метод заменяет вызов метода single , поэтому он не может просто замените лямбда-выражение, состоящее из более чем одного вызова метода.
Лямбда-выражение формы input -> getValueProvider().apply(input)
может быть заменено на getValueProvider()::apply
, если и только если время оценки getValueProvider()
не имеет значения, как в лямбдной форме, метод вызывается для каждой оценки лямбда-тела, а для ссылки на метод он вызывается только один раз и результат захватывается.
Это похоже на разницу между x -> System.out.println(x)
и System.out::println
, где чтение содержимого поля System.out
происходит в разное время, но обычно это не имеет значения. Но вы должны знать разницу.
В вашем примере вызывается третий метод getValue()
. Единственный способ выразить это с помощью ссылок на методы требует функционального интерфейса, такого как Function
, который имеет такие методы, как andThen
и / или compose
. Тем не менее, как работает Java 8, для чего требуется, чтобы первая ссылка метода на целевой интерфейс вызывала метод комбинирования, который отнюдь не будет легче читать, что у вас есть лямбда-выражение: ((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)
, где Y
тип apply(input)
возвращается.
Обратите внимание, что правило гласит: «Замените лямбда с помощью ссылок на методы , когда это возможно », что дает вам возможность сказать: «ну, здесь невозможно », Однако, я не уверен, как много вы можете назвать это« правилом »тогда ...
Также прост для цикла с in будет работать
sum(['HS+P+SD' in x for x in df['class']])
О времени (если вы хотите проверить эту ссылку )
df=pd.concat([df]*100)
%timeit df['class'].str.contains('HS+P+SD', regex=False).sum()
1000 loops, best of 3: 410 µs per loop
%timeit sum(['HS+P+SD' in x for x in df['class']])
10000 loops, best of 3: 123 µs per loop
Попробуйте:
print(len(split_df[split_df["class"].str == 'HS+P+SD']))