Recalcular valor do atributo de um Objeto

Olá galera,
essa é uma parte da estrutura do projeto:

As Notas que forem sendo cadastradas possuirão no máximo 2 produtos, PICOLE LIMAO e MORANGO, com uma determinada quantidade. Essas Notas determinam a quantidade de Picolés que possuo.

O Recibo possui praticamente a mesma estrutura da Nota, a diferença é que quando um recibo é gerado, com os produtos e a quantidade de cada produto, é debitado do saldo das Notas os produtos dos Recibos.

Exemplo:
Nota: 16100
produtos: PICOLE LIMAO: 100CX e PICOLE MORANGO: 100CX

Gero:
Recibo: 00001
Produtos: PICOLE LIMAO: 20CX e PICOLE MORANGO: 10CX

No fim a Nota 16100 deve conter PICOLE LIMAO: 80CX e PICOLE MORANGO: 90CX.

Esse é o código que salva o Recibo no Banco e que debita das Notas os saldos dos produtos que saíram:

public void salvar(Recibo recibo) throws ServiceException {
		salvar(dao, recibo);
		List<Produto> produtosRecibo = recibo.getItens().stream().map(item -> item.getProduto()).collect(Collectors.toList());

		try {
			List<Nota> notasDB = notaDAO.getNotas();
			notasDB.forEach(nota -> {
				nota.getItens().forEach(itemNota -> {
					recibo.getItens().forEach(itemRecibo -> {
						if (itemRecibo.getProduto().equals(itemNota.getProduto())) {
							if (itemNota.getQuantidade() >= itemRecibo.getQuantidade()) {
								int quantidadeNota = itemNota.getQuantidade();
								int quantidadeRecibo = itemRecibo.getQuantidade();

								itemNota.setQuantidade(quantidadeNota - quantidadeRecibo);
							}
						}
					});
				});
			});

			notasDB.forEach(nota -> {
				try {
					alterar(notaDAO, nota);
				} catch (ServiceException e) {
					e.printStackTrace();
				}
			});

		} catch (DAOException e) {
			throw new ServiceException(e);
		}
	}

O problema dele é que debita de todas as notas!
O que eu gostaria é que se uma Nota não possuir a quantidade suficiente, então é debitado da Nota seguinte.