Вот версия, сделанная в ints - как задано в вопросе.
Использование:
StreamUtil.takeWhile(IntStream.iterate(1, n -> n + 1), n -> n < 10);
Вот код для StreamUtil:
import java.util.PrimitiveIterator;
import java.util.Spliterators;
import java.util.function.IntConsumer;
import java.util.function.IntPredicate;
import java.util.stream.IntStream;
import java.util.stream.StreamSupport;
public class StreamUtil
{
public static IntStream takeWhile(IntStream stream, IntPredicate predicate)
{
return StreamSupport.intStream(new PredicateIntSpliterator(stream, predicate), false);
}
private static class PredicateIntSpliterator extends Spliterators.AbstractIntSpliterator
{
private final PrimitiveIterator.OfInt iterator;
private final IntPredicate predicate;
public PredicateIntSpliterator(IntStream stream, IntPredicate predicate)
{
super(Long.MAX_VALUE, IMMUTABLE);
this.iterator = stream.iterator();
this.predicate = predicate;
}
@Override
public boolean tryAdvance(IntConsumer action)
{
if (iterator.hasNext()) {
int value = iterator.nextInt();
if (predicate.test(value)) {
action.accept(value);
return true;
}
}
return false;
}
}
}
Я запустил бы путем записи интерфейса и класса обертки, который будет инкапсулировать эту логику и затем использовать интерфейс в моем контроллере:
public interface IAuth
{
void DoAuth(string userName, bool remember);
}
public class FormsAuthWrapper : IAuth
{
public void DoAuth(string userName, bool remember)
{
FormsAuthentication.SetAuthCookie(userName, remember);
}
}
public class MyController : Controller
{
private readonly IAuth _auth;
public MyController(IAuth auth)
{
_auth = auth;
}
}
Теперь IAuth
мог легко дразниться в модульном тесте и проверить, что контроллер называет ожидаемые методы на нем. Я НЕ был бы модульный тест FormsAuthWrapper
класс, потому что это просто делегирует вызов к FormsAuthentication
, который делает то, что это, как предполагается, делает (гарантия Microsoft:-)).