Me estoy haciendo un comportamiento inesperado cuando se utiliza corrientes y escáneres de Java

Jaquarh:

Hace poco vi un tema de algunos cursos Uni que estaba siendo conducido por un amigo que fue instruido para hacerlo de una manera determinada. Yo pensé que tomaría la oportunidad de saltar en la tarea.

He creado una clase de libro de esta manera:

class Book
{
    private String author, title;

    public Book setAuthor(String a)
    {
        author = a;
        return this;
    }

    public Book setTitle(String t)
    {
        title = t;
        return this;
    }

    public String getAuthor() 
    {
        return author;
    }

    public String getTitle()
    {
        return title;
    }
}

El concepto es que un usuario puede crear varios libros al inicio del programa y luego buscar un autor:

private final static int BOOK_NO = 3;
private final static SO instance = new SO(); // This is whatever you called the class

public static void main(String[] args)
{
    Book[] books = new Book[BOOK_NO];
    Scanner kybd = new Scanner(System.in);

    for(int i = 0; i < BOOK_NO; i++)
    {
        books[i] = instance.addBook(kybd, new Book());
    }

    Arrays.stream(instance.findBook(kybd, books)).forEach(o -> {
        System.out.println(o.getTitle() + " by " + o.getAuthor());
    });
}

public Book addBook(Scanner s, Book b)
{

    System.out.println("Enter the Author of this book:");
    b.setAuthor(s.next());

    System.out.println("Enter the Title of this book:");
    b.setTitle(s.next());

    return b;
}

public Book[] findBook(Scanner s, Book[] bs)
{
    System.out.println("Search a book by author:");

    List<Book> finding = Arrays .stream(bs)
            .filter(o -> o.getAuthor().equalsIgnoreCase(s.next()))
            .collect(Collectors.toList());

    System.out.println("Found " + finding.size() + " matches.");

    Book[] output = new Book[finding.size()];
    output = finding.toArray(output);
    return output;
}

Ahora todo el programa funciona bien, sin embargo estoy experimentar un comportamiento inesperado con el escáner cuando se trata de la búsqueda de un libro. Aquí es un comportamiento de entrada / salida directa Estoy experimentando:

Enter the Author of this book:
Foo
Enter the Title of this book:
Bar
Enter the Author of this book:
Foo
Enter the Title of this book:
FooBar
Enter the Author of this book:
Bar
Enter the Title of this book:
Foo
Search a book by author:
Foo
Foo
Foo
Found 2 matches.
Bar by Foo
FooBar by Foo

Como se puede ver, estoy teniendo que escribir el autor del libro en el escáner 3 veces antes de obtener ningún resultado. ¿Cómo puedo mitigar este? ¿Qué está causando esto suceda?

GBlodgett:

Esto es porque en el Streamse llama next(), por lo que para cada Bookobjeto en el Stream, el Predicatede la llamada al filtro se aplica a ella, y next()será llamado. Resolverla a una variable por lo que no se llama más de una vez:

String book = s.next();
List<Book> finding = Arrays.stream(bs)
                           .filter(o -> o.getAuthor().equalsIgnoreCase(book))
                           .collect(Collectors.toList());

filter()acepta una Predicate, que en este caso va a ser algo como:

Predicate<String> pred = str -> str.equalsIgnoreCase(s.next());

Así que cada vez que se aplica, next()será llamado

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=190562&siteId=1
Recomendado
Clasificación